【发布时间】: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 搜索是有序的。
标签: c++ multithreading visual-c++