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

そして各エンキュー関数では、それは1によって通知されます

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

最初のエンキューの前に複数の待機行を追加しようとしましたが、それでも機能しません...

お願い助けて ..

環境:

VC2012 Ult、Windows7 Ult、空のプロジェクトからスタート

4

1 に答える 1

0

CreateSemaphore有効なハンドルが返されるかどうかを確認します。CreateSemaphoreに次のコメントがあります。

セマフォの最大カウント値を INFINITE に設定すると、対応するハンドルが無効になります。

于 2013-09-24T07:28:59.627 に答える