0

クリティカル セクションを共有する 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 では動作しないようです (または、私のコードに何か問題があります)。誰かがこれに光を当てることができますか?

ありがとう!

4

2 に答える 2

3

スレッド A はおそらく、Sleep(0)または同様の呼び出しでタイムスライスを生成する必要があります。クリティカル セクション操作は、通常、ユーザー モード コードにとどまるため、カーネルへの移行を行わず、スレッド A のタイムスライスを放棄しません。

于 2013-09-20T19:40:19.697 に答える
0

このようなタイトなループで譲歩したい場合は、おそらくクリティカル セクションの代わりにミューテックスを使用してそれを達成できます(免責事項: 私は確認していません)。

于 2013-09-22T14:02:33.150 に答える