请参考下面的代码:
#include <windows.h>
int main(int argc, char* argv[])
{
HANDLE _mutex = ::CreateMutex(NULL, FALSE, "abc");
if (!_mutex)
throw std::runtime_error("CreateMutex failed");
if (::WaitForSingleObject(_mutex, INFINITE) != WAIT_OBJECT_0)
throw std::runtime_error("WaitForSingleObject failed");
printf("Must lock here\n");
if (::WaitForSingleObject(_mutex, INFINITE) != WAIT_OBJECT_0)
throw std::runtime_error("WaitForSingleObject failed");
printf("Why come here????\n");
return 0;
}我不知道为什么控制台会打印出来:
Must lock here
Why come here???互斥锁不工作吗?我只想让结果显示出来
Must lock here并在打印上面的文本后阻塞。
发布于 2010-08-24 09:43:09
如果您想要一个行为如您所描述的同步原语,您可以使用自动重置事件来代替。
#include <windows.h>
#include <stdexcept>
#include <stdio.h>
int main(int argc, char* argv[])
{
HANDLE _mutex = ::CreateEvent(NULL, FALSE, TRUE, NULL);
// auto reset // initially signalled
if (!_mutex)
throw std::runtime_error("CreateEvent failed");
if (::WaitForSingleObject(_mutex, INFINITE) != WAIT_OBJECT_0)
throw std::runtime_error("WaitForSingleObject failed");
// unsignalled now
printf("Must lock here\n");
// will block forever until someone calls SetEvent
if (::WaitForSingleObject(_mutex, INFINITE) != WAIT_OBJECT_0)
throw std::runtime_error("WaitForSingleObject failed");
printf("Why come here????\n");
return 0;
}发布于 2010-08-24 09:30:24
除了您的主线程之外,没有其他线程拥有互斥锁的所有权。这就是它不阻塞的原因,您可以看到两个print语句。下面是MSDN链接的摘录,它清楚地解释了how mutex works。
在线程获得互斥锁的所有权后,它可以在重复调用等待函数时指定相同的互斥锁,而不会阻塞其执行。这可以防止线程在等待已经拥有的互斥锁时死锁自身。要在这种情况下释放其所有权,每次互斥量满足等待函数的条件时,线程都必须调用一次ReleaseMutex。
您可以创建多个线程来查看阻塞行为的实际效果。注意:您的代码也缺少ReleaseMutex调用。
发布于 2010-08-24 09:26:34
更新:阅读c++中的互斥锁
我不是c++专家,但是线程拥有一个互斥锁。在您的示例中,相同的线程打开/创建已命名的互斥锁,因此第二个调用不会阻塞。
看一下这个:“使用互斥对象”。
http://msdn.microsoft.com/en-us/library/ms686927(v=VS.85).aspx
-Oisin
https://stackoverflow.com/questions/3552931
复制相似问题