2011-02-26 101 views
1

喜欢所以我叫createmutex所以CreateMutex混乱

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

它运行循环两次后罚款,但在第三圈后WaitForSingleObject的(H,INFINITE)死锁。这是与两个线程同时运行。 ReleaseMutex被调用时它怎么会死锁?是否正确调用了createmutex函数?

回答

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."

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

+0

所以用一个false参数调用CreateMutex,并把它放在while循环之外 – Jake 2011-02-26 06:11:04

3

我怀疑你正试图在单个进程中实现互斥。如果是这样,那么正确的同步对象是critical section。这些对象的命名有点令人困惑,因为互斥和关键部分都会互相排斥。

临界区的界面使用起来更简单,它本质上是一个获取函数和相应的释放函数。如果你在一个进程中同步,并且你需要一个简单的锁(而不是信号量),你应该使用临界区而不是互斥锁。实际上,最近在Stack Overflow上,我写了一个更多的detailed answer来描述关键部分的标准使用模式。该文章有很多链接到MSDN文档的相关部分。

当您执行跨进程同步时,您只需要使用互斥锁。事实上,当你在一个进程中进行同步时,你应该只使用一个互斥体,因为关键部分表现得更好(即更快)。