信号量无法阻止 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 控制台应用程序中的线程的主要内容,如果未能解决你的问题,请参考以下文章