请参阅以下代码:
#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
打印上面的文字后阻塞。
答案 0 :(得分:4)
主线程以外的其他任何线程都没有互斥锁的所有权。这就是它没有阻塞的原因,你看到两个打印语句。以下是MSDN链接的摘录,清楚地解释了how mutex works。
线程获得a的所有权后 互斥,它可以指定相同的互斥锁 在反复拨打电话 等待函数而不阻塞它 执行。这可以防止线程 在等待的时候陷入僵局 它已经拥有的互斥量。要发布 它的所有权 情况下,线程必须调用 每次发布一次ReleaseMutex 互斥体满足了条件 等待功能。
您可以创建多个线程来查看阻止行为。注意:您的代码也缺少ReleaseMutex来电。
答案 1 :(得分:2)
如果你想要一个行为与你所描述的一样的同步原语,你可以使用自动重置事件。
#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;
}
答案 2 :(得分:0)
更新:阅读c ++中的互斥锁
我不是c ++专家,但是线程拥有互斥锁。在您的示例中,同一个线程打开/创建命名的互斥锁,因此第二个调用不会阻塞。
看看这个:“使用互斥对象。”
http://msdn.microsoft.com/en-us/library/ms686927(v=VS.85).aspx
-Oisin
答案 3 :(得分:0)
它“不起作用”的“原因”是没有理由应该这样做。 FALSE参数表示您正在寻找现有的互斥锁,一方面。阅读文档。 http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx
您确定要使用互斥锁而不是CRITICAL_SECTION吗?