WaitForSingleObject不起作用

时间:2010-08-24 01:22:50

标签: c++ winapi

请参阅以下代码:

#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

打印上面的文字后阻塞。

4 个答案:

答案 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吗?