如何等待直到互斥锁解锁

How to wait until mutex unlocked?

本文关键字:解锁 何等待 等待      更新时间:2023-10-16

存在一个互斥体数组。我的功能:

  1. 检查互斥锁是否被锁定

2 a。如果没有,则锁定它

2 b。如果锁定,等待解锁并锁定

另一个函数将其解锁。

问题是我在等待区崩溃了:

HANDLE mutexes[N];
void func(int i)
{
  // (*) wait until unlocked or create if unlocked
  while ((mutexes[i] = CreateMutex(NULL, TRUE/*same with FALSE*/, NULL)) != NULL);
  /*or WaitForSingleObject(mutexes[i], INFINITE)*/
  mutexes[i] = CreateMutex(NULL, TRUE, NULL);
}

在(*)点我有崩溃访问冲突。当它试图创建互斥锁[i]时发生崩溃,而互斥锁之前已经创建了。我不能使用WaitForSingleObject,因为第一次互斥锁[I]没有创建,文档说WaitForSingleObject是未定义的。另外,如果我使用这个函数,我得到同样的崩溃。

我所需要的是这样一个简单的伪代码的模拟

if (mutex_has_been_created[mutexes[i]])
  WaitUntilRelease()
CreateMutex();

我试着把它包装在临界区,得到了相同的结果。我确信i在正确的范围内。我不能使用Boost/pThreads/等

我知道我的问题很简单,但我就是找不到解决方法。在所有的例子中,我都看到在WaitForSingleObject之前创建互斥锁,这对我来说不起作用。

谢谢。

您确实需要理清代码的逻辑:创建互斥锁和锁锁是不同的操作,应该这样对待。坦率地说,所有这些"试图创建已经创建的互斥锁"的事情并没有多大意义。

简要

:

  1. CreateMutex初始化("创建")互斥锁
  2. WaitForSingleObject et al锁定互斥锁(或超时)。
  3. ReleaseMutex解锁
  4. CloseHandle破坏它。

创建/销毁互斥锁一次,在此期间可以任意多次锁定/解锁互斥锁。

当你试图锁定一个已经被别人锁定的互斥锁时,你的线程会自动阻塞,直到互斥锁可用。

如果您想等到解锁后再锁定它,那么您可以直接锁定它。这就是你这么做的结果。当您尝试锁定时,代码会阻塞,直到互斥量可用,然后锁定它。

对于posix线程,您可能会使用条件变量;我不知道如果WinAPI提供类似的东西

HANDLE mutexes[N]
void InitMutexes(int N)
{
    for (int i =0; i < N ; i++)
    {           
        mutexes[i] = CreateMutex( NULL, FALSE, NULL);
    }
}
void WaitForMutex(int n)
{
    WaitForSingleObject(mutexes[n], INFINITE);
}
void ReleaseMutex(int n)
{
    ReleaseMutex(mutexes[n]);
}
void CleanUpMutexes(int N)
{
    for (int i=0; i < N; i++)
    {
          ReleaseMutex(mutexes[i]); CloseHandle(mutexes[i]);
    }
}

希望对你有帮助。