如何等到互斥锁解锁?

时间:2011-12-01 08:43:51

标签: c++ multithreading winapi

有一系列互斥锁。 我的功能:

  1. 检查是否锁定了互斥锁
  2. 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);
    }
    

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

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

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

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

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

    谢谢。

4 个答案:

答案 0 :(得分:15)

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

简言之:

  1. CreateMutex初始化(“创建”)互斥锁。
  2. WaitForSingleObject等锁定互斥锁(或超时)。
  3. ReleaseMutex解锁。
  4. CloseHandle摧毁它。
  5. 您可以创建/销毁互斥锁​​一次,然后在锁定/解锁之间多次。

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

答案 1 :(得分:4)

如果你想要等到它解锁,只能锁定它,那么你就可以锁定它。这正是你这样做时会发生的事情。当您尝试锁定时,代码会阻塞,直到互斥锁变为可用,然后将其锁定。

答案 2 :(得分:1)

使用posix线程你可能会使用condition variables;我不知道WinAPI是否提供类似的东西。

答案 3 :(得分:1)

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]);
    }
}

希望有所帮助。