首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitForSingleObject不工作

WaitForSingleObject不工作
EN

Stack Overflow用户
提问于 2010-08-24 09:22:50
回答 4查看 6.3K关注 0票数 3

请参考下面的代码:

代码语言:javascript
复制
#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;
}

我不知道为什么控制台会打印出来:

代码语言:javascript
复制
Must lock here
Why come here???

互斥锁不工作吗?我只想让结果显示出来

代码语言:javascript
复制
Must lock here

并在打印上面的文本后阻塞。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-24 09:43:09

如果您想要一个行为如您所描述的同步原语,您可以使用自动重置事件来代替。

代码语言:javascript
复制
 #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;
 }
票数 3
EN

Stack Overflow用户

发布于 2010-08-24 09:30:24

除了您的主线程之外,没有其他线程拥有互斥锁的所有权。这就是它不阻塞的原因,您可以看到两个print语句。下面是MSDN链接的摘录,它清楚地解释了how mutex works

在线程获得互斥锁的所有权后,它可以在重复调用等待函数时指定相同的互斥锁,而不会阻塞其执行。这可以防止线程在等待已经拥有的互斥锁时死锁自身。要在这种情况下释放其所有权,每次互斥量满足等待函数的条件时,线程都必须调用一次ReleaseMutex。

您可以创建多个线程来查看阻塞行为的实际效果。注意:您的代码也缺少ReleaseMutex调用。

票数 4
EN

Stack Overflow用户

发布于 2010-08-24 09:26:34

更新:阅读c++中的互斥锁

我不是c++专家,但是线程拥有一个互斥锁。在您的示例中,相同的线程打开/创建已命名的互斥锁,因此第二个调用不会阻塞。

看一下这个:“使用互斥对象”。

http://msdn.microsoft.com/en-us/library/ms686927(v=VS.85).aspx

-Oisin

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3552931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档