クリティカル セクションを共有する 2 つのスレッドがあります。スレッド A はクリティカル セクションのロックを永続的に保持しますが、次のコードを 1 秒あたり約 50 回実行して、スレッド B に介入する機会を与えます。
LeaveCriticalSection(sec);
EnterCriticalSection(sec);
ただし、このコードを使用すると、スレッド B はクリティカル セクションを取得する機会がないように見えます。代わりに、スレッド B で EnterCriticalSection(sec) を呼び出すと、そのスレッドは永久にブロックされますが、スレッド A は 1 秒あたり 50 回クリティカル セクションのロックを解除しています。
スレッド A の 50hz タイマーでの LeaveCriticalSection() と EnterCriticalSection() の呼び出しの間隔が短いことはわかっていますが、クリティカル セクションで待機している他のスレッドに LeaveCriticalSection() の呼び出しが渡されることを期待しています。実行を続行する前に。
LeaveCriticalSection() はこのように動作しないはずですか? もしそうなら、クリティカル セクションのロックを解除した後、明示的に他のスレッドに譲る方法はありますか? POSIX にはそのための sched_yield() のようなものがありますが、pthread_mutex_unlock() は他のスレッドに自動的に介入する機会を与えるため、POSIX では必要でさえないと思います。
しかし、Windows では動作しないようです (または、私のコードに何か問題があります)。誰かがこれに光を当てることができますか?
ありがとう!