0

我遇到了一个非常奇怪的问题:尽管信号量已经为 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);

并且在每个入队函数中,它将由一个信号

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

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

请帮帮我 ..

环境:

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

4

1 回答 1

0

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

将 Semaphore 的最大计数值设置为 INFINITE 会使其对应的 Handle 无效。

于 2013-09-24T07:28:59.627 回答