信号量无法阻止 Win32 控制台应用程序中的线程

Posted

技术标签:

【中文标题】信号量无法阻止 Win32 控制台应用程序中的线程【英文标题】:Semaphore fail to block thread in Win32 console app 【发布时间】:2013-09-24 06:55:39 【问题描述】:

我遇到了一个非常奇怪的问题:windows.h 中的 WaitForSingleObject() 无法阻止线程,尽管信号量已经为 0。

这是我的代码:

int main(int argc, char** argv)

    MsgQueue mainQueue;

    //WaitForSingleObject(mainQueue.procSema,(DWORD)(INFINITE));

    mainQueue.Enqueue_Back(_T("hello world!"));
    mainQueue.Enqueue_Back(_T("This is the second test line"));
    mainQueue.Enqueue_Back(_T("Here's the third line"));

    TCHAR buffer[256];
    int ct = 0;
    while(true)
    
        cout<<"Start wait ... "<<ct++<<endl;
        WaitForSingleObject(mainQueue.procSema,(DWORD)(INFINITE));
        memset(buffer,0,256*sizeof(TCHAR));

        mainQueue.Dequeue_Front(buffer,255);
        cout<<buffer<<endl;
    
    return 0;

我发现信号量 - mainQueue.procSema 无法阻止循环,即使它已经等待为 0。

信号量是这样声明和初始化的:

procSema = CreateSemaphore(NULL,(LONG)(0),(LONG)(INFINITE),NULL);

并且在每个入队函数中,都会由一个发出信号

ReleaseSemaphore(procSema,(LONG)(1),NULL);

我尝试在我的第一个队列之前添加多个等待行,但它仍然不起作用...

请帮帮我..

环境:

VC2012 Ult,Windows7 Ult,从空项目开始

【问题讨论】:

你应该检查WaitForSingleObject()的返回值。 捕获WaitForSingleObject的返回值。它有 4 个可能的值,如此处所述。这将告诉您是什么发出了 WaitForSingleObject 方法的信号。 msdn.microsoft.com/en-us/library/windows/desktop/… @MatsPetersson 抱歉重复您的回答,在我去获取 MSDN 链接时您已经发布了 :) 信号量可能不是实现并发队列的最佳方式。在 [concurrent queue c++] 上的 Google 搜索是有序的。 【参考方案1】:

检查CreateSemaphore 是否返回有效句柄,CreateSemaphore 有注释:

将信号量的最大计数值设置为 INFINITE 将使 对应的句柄无效。

【讨论】:

以上是关于信号量无法阻止 Win32 控制台应用程序中的线程的主要内容,如果未能解决你的问题,请参考以下文章

win32 窗口阻止键盘布局更改

使用Win32 API实现生产者消费者线程同步

win32 相关同步api

win32 相关同步api

线程运行一个我无法控制的无限操作。如何阻止它? [复制]

mingw-w64 线程:posix vs win32