如何等到互斥锁解锁?

fog*_*bit 3 c++ winapi multithreading

有一系列互斥体.我的功能:

  1. 检查是互斥锁被锁定

2A.如果没有,那么锁定它

2B.如果已锁定,请等待解锁并锁定它

另一个功能解锁它.

问题是我在等待部分遇到了崩溃:

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);
}
Run Code Online (Sandbox Code Playgroud)

在(*)点,我遇到了崩溃 - 访问冲突.当它试图创建之前已经创建的互斥锁[i]时发生崩溃.我不能使用WaitForSingleObject,因为第一次没有创建互斥锁[i],文档说WaitForSingleObject未定义.此外,如果我使用此功能,我会得到同样的崩溃.

我只需要这种简单伪代码的模拟

if (mutex_has_been_created[mutexes[i]])
  WaitUntilRelease()
CreateMutex();
Run Code Online (Sandbox Code Playgroud)

我试图将它包装在一个关键部分并获得相同的结果.我确信这i是在正确的范围内.我不能使用Boost/pThreads/etc.

我知道我的问题很简单,但我找不到解决方案.在所有示例中,我都看到过之前创建了一个互斥锁WaitForSingleObject,这对我来说不起作用.

谢谢.

NPE*_*NPE 15

你真的需要理清代码的逻辑:互斥体的创建和锁定/解锁是不同的操作,应该这样对待.坦率地说,所有这些"尝试创建已经创建的互斥体"的业务并没有多大意义.

简述:

  1. CreateMutex 初始化("创建")互斥锁.
  2. WaitForSingleObject 等人锁定互斥锁(或超时).
  3. ReleaseMutex 解锁它.
  4. CloseHandle 摧毁它.

您可以创建/销毁互斥锁​​一次,并在锁定/解锁之间任意多次.

当您尝试锁定已被其他人锁定的互斥锁时,您的线程会自动阻塞,直到互斥锁变为可用.


R. *_*des 5

如果你想等到解锁后才锁定它,那么你可以直接锁定它。当你这样做时,就会发生这样的情况。当您尝试锁定时,代码会阻塞,直到互斥体变得可用,然后锁定它。

  • 这就是“WaitForSingleObject”的作用。 (3认同)