创建互斥体混乱

Jak*_*ake 1 c++ multithreading

所以我像这样调用了createmutex

  while(1){
    HANDLE h;
    h=CreateMutex(NULL,TRUE,"mutex1");
    y=WaitForSingleObject(h,INFINITE);
    ///random code
    ReleaseMutex(h)
   }
Run Code Online (Sandbox Code Playgroud)

循环两次后运行良好,但在第三次循环后在 WaitForSingleObject (h,INFINITE) 上死锁。这是两个线程同时运行的情况。调用ReleaseMutex怎么会死锁呢?createmutex 函数是否正确调用?

Ben*_*igt 5

您正在等待已拥有的互斥锁...请不要这样做。

另外,您不会破坏互斥锁,而只是释放它。下一个电话应该会给你ERROR_ALREADY_EXISTS。MSDN 的完整引用是“如果互斥体是命名互斥体并且该对象在此函数调用之前存在,则返回值是现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS, bInitialOwner 被忽略,并且调用线程不被授予所有权。”

如果任何“随机代码”等待另一个线程取得进展,则它在拥有互斥体时可能会发生死锁。在这种情况下,另一个线程将永远等待尝试获取互斥体,这就是您所看到的行为。