今日私はMSDNでこれに出くわしました:
他のスレッドが続行する準備ができていることを通知するために使用するスレッドごとに1つ。コンシューマースレッドは、プロデューサーがイベントを通知するのを待ってからクリティカルセクションに入り、プロデューサースレッドは、コンシューマースレッドがイベントを通知するのを待ってからクリティカルセクションに入る。各スレッドがクリティカルセクションを離れた後、他のスレッドを解放するようにイベントに通知します。」
最初はWTFと思いました!-私は常に、スレッドがクリティカルセクションを取得しようとした順序で取得することを想定していました。これはServicePackの動作に奇妙な大きな変化があるように見えますが、ServicePackはWindowsのServerEdition用であり、Vistaは当時開発中でした。
とにかく、それは少し意味があります-このように、スケジューラーが回転する次の待機中のスレッドは、少なくとも次のクリティカルセクションを取得するスレッドになると思います。したがって、彼らが楽しみのためにランダムな選択をすることに決めない限り、それが理にかなっている唯一のことです;)。
それでも、これは私が行った仮定であり、現在、FIFO依存のケースが問題にならないことを確認するためにコードを評価しています。
誰かがこれに関して現実の問題を抱えていましたか?クリティカルセクションを取得するスレッドの順序はFIFOであることが保証されていませんが、通常はFIFOではありませんか?通常はFIFO(またはFIFOに近い)ではない場合、スレッドが激しく争われているクリティカルセクションを待機できる時間を知っている人はいますか?優先度の低いスレッドの場合、クリティカルセクションを取得しようとする優先度の高いスレッドが常に存在する場合(FIFOが順守されていれば、優先度の低いスレッドがずっと前に並んでいたとしても)、ほぼ無期限に待機し続ける可能性があります。 )?このシナリオを防ぐための安全上の問題はありますか、それともセカンダリ同期オブジェクトへの依存が義務付けられていますか?
もちろん、これは本当に激しく争われているクリティカルセクションでのみ重要です。
わからない、多分私はそれをやりすぎているのかもしれない...しかし何かがこれについて私を悩ませている。任意の洞察をいただければ幸いです。ありがとう ;)