2013-09-24 86 views
0

我遇到了一個非常奇怪的問題:即使信號量已經爲0,windows.h中的WaitForSingleObject()仍然無法阻塞線程。信號量無法在Win32控制檯應用程序中阻止線程

這裏是我的代碼:

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,從空項目開始

+0

您應該檢查'WaitForSingleObject()'的返回值。 –

+0

捕獲WaitForSingleObject的返回值。它有4個可能的值,這裏記錄。這會告訴你什麼是WaitForSingleObject方法的信號。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29.aspx –

+0

@MatsPetersson對不起,重複你的答案,你已經發布的時間,我去抓取MSDN鏈接:) –

回答

0

檢查CreateSemaphore返回有效的句柄,有在CreateSemaphore這一評論:

設置一個信號量的最大計數值到INFINITE將使得 它的相應處理無效。

相關問題