12

I am implementing conditional wait, and both semaphore or conditional varible can be used to implement it. Is there any difference between the two? More specifically from the performance point of view?

I have heard that when a thread waits on a conditional variable it is not scheduled until it is signaled. This ensures that it does not consume CPU cycle. But this is not true for a semaphore and a semaphore will consume CPU cycle even if it is waiting?

4

3 に答える 3

19

すべてのスレッドがタスクの送信などのイベントを待機している場合は、イベント時に条件変数を使用してすべてのスレッドをウェイクアップできます。

リソースが限られている場合、たとえばスレッド用に10ページのメモリが予約されている場合は、ページが使用可能になるまで待機する必要があります。この場合、1つのスレッドだけで実行を開始する必要があります。この場合、セマフォを使用して、使用可能なページと同じ数のスレッドのロックを解除できます。

于 2012-07-27T04:26:30.273 に答える
3

セマフォには追加の状態 (保持されているユニットの数) と、それを待機しているスレッドのキューがあるため、たとえば、現在待機しているスレッドがなくても、セマがシグナルを受け取った回数を記録できます。スレッドがセマフォ wait() をループし、セマフォが N 回通知されると、セマが通知されたときにスレッドが時々ビジーであっても、スレッドは最終的に N 回ループします。これはプロデューサー/コンシューマー キューに非常に役立ちます。

condvar にはこの余分なカウント状態はありませんが、スレッドがシグナルを送るまでバインドされているロックを解放できます。これはプロデューサー/コンシューマー キューに非常に役立ちます。

時々、私は 2 つの組み合わせ (condvar とカウント) を望んでいますが、これは OS 開発者からは来ていないようです :(

セマフォと condvar は、どちらも同期プリミティブであるという点で同じです。それとは別に..

于 2012-07-27T09:31:16.743 に答える
0

条件変数とバイナリセマフォはどちらも、指定されたシグナル状態 true までスレッドをブロックし、どちらも同じですが、条件変数は常にミューテックスで使用できます。どちらの場合も、シグナルなしでスケジュールすることはできません。ただし、この場合にリソースの数を維持するには、カウントセマフォを使用します。ミューテックスを使用すると、どちらもCPUを消費しません。

于 2016-02-24T10:48:43.237 に答える