所以我这样称为createmutex
while(1){
HANDLE h;
h=CreateMutex(NULL,TRUE,"mutex1");
y=WaitForSingleObject(h,INFINITE);
///random code
ReleaseMutex(h)
}
循环两次后运行正常,但在第三次循环后在WaitForSingleObject(h,INFINITE)上死锁。这是两个并发运行的线程。调用ReleaseMutex时,它怎么会死锁? createmutex函数是否正确调用?
答案 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文档的相关部分。
执行跨进程同步时,只需使用互斥锁。实际上,当您在整个流程中进行同步时,您应该只使用互斥锁,因为关键部分的性能要好得多(即更快)。