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

时间:2013-09-24 06:55:40

标签: c++ multithreading visual-c++

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

这是我的代码:

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);

并在每个enqueue函数中,它将由一个

发出信号
ReleaseSemaphore(procSema,(LONG)(1),NULL);

我试图在我第一次入队之前添加多个等号行,但它仍然不起作用......

请帮助我..

环境:

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

1 个答案:

答案 0 :(得分:0)

检查CreateSemaphore是否返回有效句柄,CreateSemaphore处有评论:

  

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