セマフォがすでに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);
そして各エンキュー関数では、それは1によって通知されます
ReleaseSemaphore(procSema,(LONG)(1),NULL);
最初のエンキューの前に複数の待機行を追加しようとしましたが、それでも機能しません...
お願い助けて ..
環境:
VC2012 Ult、Windows7 Ult、空のプロジェクトからスタート