抽象的には、セマフォはそれに関連付けられたいくつかの許可を持つロックです。セマフォは次の2つの操作をサポートします。
- 許可の数を増やすUp、および
- ダウン。許可の数を減らそうとします。十分な許可が利用できない場合、この操作は十分な許可が利用可能になるまで待機します。
セマフォを実装する方法はたくさんあります。ただし、通常、セマフォはスピンロックとして実装されておらず、実際にはOSにスレッドをブロックさせ、要求された許可が利用可能になるまでスレッドをスリープ状態にします。とはいえ、セマフォを完全に合法的に実装すると、ビジーウェイトになる可能性があります。私はこれを行う実装を知らないだけです。
条件変数は異なる概念を表します。通常、セマフォは、非常に多くのコピーしか存在しないリソースを管理するように設計されています。リソースを必要とする各スレッドは、リソースへのアクセスを保護するセマフォが使用可能になるまで待機し、リソースを使用する各スレッドは1つの許可を所有します。条件変数は通常、スレッドが特定のイベントの発生を待機できるようにするために使用されます。彼らは通常、操作をサポートします
- 信号が送られるまでスレッドをブロックする待機、
- 通知します。これは、条件変数を待機している1つのスレッドに、続行できることを通知します。
- Notify-allは、条件変数を待機しているすべてのスレッドに続行できることを通知します。
条件変数とセマフォは(通常)交換可能に使用でき、ロックの使用法の設計を適切に変更できます。ただし、セマフォの操作が簡単な場合もあれば、条件変数の操作が簡単な場合もあるため、両方のプリミティブを使用できます。通常、使用している特定のライブラリまたは言語のために、どちらか一方を使用することを選択します。たとえば、Javaオブジェクトにはモニター(ロックとペアになった条件変数)のサポートが組み込まれているため、Javaセマフォは存在しますが、Javaで条件変数を使用すると便利なことがよくあります。Windowsでプログラミングしている場合、条件変数は存在しますが、セマフォが同期の推奨される方法です。
お役に立てれば!