2つのスレッドのメッセージキューを実装したいと思います。スレッド#1はメッセージをキューにポップして処理します。スレッド#2は、メッセージをキューにプッシュします。WaitForSingleObject()関数とSetEvent()関数を同期させるアルゴリズムはありますか?
はここに私のコードです:SetEvent(hWakeUpEvent)
がWaitForSingleObject()
前に呼び出される場合があります
Thread #1 //Pop message and process
{
while(true)
{
Lock(mutex);
message = messageQueue.Pop();
Unlock(mutex);
if (message == NULL) //the queue is empty
{
//assume that the interruption occurs here (*)
WaitForSingleObject(hWakeUpEvent, INFINITE);
continue;
}
else
{
//process message
}
}
}
Thread #2 //push new message in queue and wake up thread #1
{
Lock(mutex);
messageQueue.Push(newMessage)
Unlock(mutex);
SetEvent(hWakeUpEvent);
}
問題がある(注(*))、それは危険なことでしょう。
私はそれを修正しようとしましたが、まだ解決していません。
誰かがこの問題を解決するアルゴリズムを持っている場合は、私にお尋ねください。
同時境界キューを検索します。それは単にあなたの問題になります。 – Nawaz
「危険でしょうか?」とはどういう意味ですか? – Tudor
あなたが言うことは問題ではないと思います。なぜなら、SetEventが最初に呼び出されると、WaitForSingleObjectはまったくスリープ状態にならずすぐに戻り、ループが次の繰り返しを続けるからです。 msdnを参照 "手動リセットイベントオブジェクトの状態は、ResetEvent関数によって明示的に非シグナリング状態に設定されるまで通知されます。オブジェクトの状態が通知されている間に待機機能を解放することができます。 – svenfx