CreateMutex混乱

时间:2011-02-26 05:52:39

标签: c++ multithreading

所以我这样称为createmutex

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

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

2 个答案:

答案 0 :(得分:4)

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

此外,您不是要销毁互斥锁​​,而是仅释放互斥锁。下一个电话会给你ERROR_ALREADY_EXISTS。 MSDN的完整引用是"If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, GetLastError returns ERROR_ALREADY_EXISTS, bInitialOwner is ignored, and the calling thread is not granted ownership."

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

答案 1 :(得分:3)

我怀疑您正在尝试在单个流程中实现互斥。如果是这样,则正确的同步对象是critical section。这些对象的命名有点令人困惑,因为互斥体和关键部分都会形成互斥。

关键部分的界面使用起来要简单得多,它本质上是一个获取功能和相应的释放功能。如果要在单个进程中进行同步,并且需要一个简单的锁(而不是信号量),则应使用关键部分而不是互斥锁。

事实上,最近在Stack Overflow上,我在一个问题中写了更多detailed answer来描述关键部分的标准使用模式。该帖子有许多链接到MSDN文档的相关部分。

执行跨进程同步时,只需使用互斥锁。实际上,当您在整个流程中进行同步时,您应该只使用互斥锁,因为关键部分的性能要好得多(即更快)。