セマフォとミューテックスの比較
Mutex
ミューテックスに関する概念は、ロックによく似ています。 部屋に入るには鍵を取得し、その鍵で入室を許可する。
Thread A Thread Bacquire mutex acquire mutex ... it will block
do something critical do something critical
release mutex release lock
トイレのカギのようなものです。 一度に一人が鍵を持つことができ、トイレを占拠することができます。 終了すると、その人は次の人に鍵を渡す(解放する)
公式には。 「ミューテックスは、通常、複数のスレッドが同時に実行できないリエントラントなコードのセクションへのアクセスをシリアライズするために使用されます。 ミューテックス オブジェクトは、制御されたセクションに 1 つのスレッドのみを許可し、そのセクションへのアクセスを得ようとする他のスレッドは、最初のスレッドがそのセクションから終了するまで待つことを強制します」
Ref: Symbian Developer Library
Semaphore
取得または取得待ちのミューテックにはないものがあるのです。 セマフォは初期値をN>1 に設定することができます。
セマフォとmutexの大きな違いは、mutexはそれを保持しているユーザーしか解放できないことです。
セマフォとミューテックスの主な違いは、ミューテックスは持っているユーザーしか解放できませんが、セマフォではユーザーがカーネル内の特定のセマフォにシグナルを送ることが可能です。
以下はセマフォの概念で、スレッドAがOKのとき、スレッドBに信号を送り、スレッドBが何かを始める。 例、同一の鍵のトイレが4つあるとします。 セマフォのカウント(鍵の数)は、最初に4と設定され(4つのトイレはすべて空いている)、その後、人が入ってくるとカウント値が減少していきます。 すべてのトイレが満杯の場合、つまり空いている鍵がない場合、セマフォのカウントは 0 になります。現在、同じように 1 人がトイレから出ると、セマフォは 1 に増加し (1つの空き鍵)、列の次の人に渡されます。
公式には、次のように説明されています。 「セマフォは、共有リソースの同時使用者数を最大数まで制限するものです。 スレッドはリソースへのアクセスを要求し (セマフォをデクリメントし)、リソースの使用を終了したことを知らせることができます (セマフォをインクリメントする)」
Ref: Symbian Developer Library
リスク
Mutex を使用すると優先順位逆転が発生する可能性があります。 mutex に基づくシナリオを慎重に設計する必要があります。