2012-07-17 12 views
6

バイナリセマフォおよびミューテックスについて読んでいる間、私は、次の相違点が見つかりました:mutexが利用可能な場合、バイナリセマフォをどこで使用するのですか?

は、値0と1を有することができ、両方が、ミューテックスは、ミューテックスのロックを取得した同じ スレッドによってロック解除することができます。 ミューテックスロックを獲得するスレッドは、より高い優先度の プロセスが同じミューテックスを取得したい場合、優先度逆転を持つことができますが、これはバイナリセマフォーの場合は ではありません。

バイナリセマフォはどこで使用しますか?誰かが例を挙げることができますか?

編集:私は両方の作業を考え出したと思います。基本的にバイナリセマフォは同期を提供し、mutexはロックメカニズムを提供します。私はGalvin OSの書籍からいくつかの例を読んで、もっと明確にしています。

答えて

5

バイナリセマフォが非常に有用である典型的な状況の1つは、スレッドが親スレッドが所有する構造体から読み取るスレッドの初期化です。親スレッドは、新しいスレッドが構造体の共有データを読み取るのを待ってから構造体の有効期間が終了するようにする必要があります(たとえば、スコープから離れる)。バイナリセマフォでは、セマフォの値を0に初期化し、親がそれを待っている間に子がそれをポストするようにするだけです。セマフォーがなければ、mutexとcondition変数とそれを使うためのより醜いプログラムロジックが必要です。

1

バイナリミューテックスの代わりにカウントされたセマフォを使用する正規の例は、a)互換性があり、b)複数のリソースを利用できる限られた数のリソースがある場合です。

たとえば、最大10人の読者がデータベースに同時にアクセスできるようにするには、カウントされたセマフォを10に初期化してリソースへのアクセスを制限することができます。各リーダーは、リソースにアクセスする前にセマフォを取得し、利用可能なカウントを減らす必要があります。カウントが0に達すると(つまり、10人の読者がデータベースにアクセスし、データベースを使用している)、他のすべての読者はロックアウトされます。読者がいったん終了すると、セマフォカウントが1つ増えてリソースが使用されなくなったことを示し、他の読者はセマフォロックを取得して代わりにアクセスできるようになります。

しかし、他のすべての同期プリミティブと同様に、カウントされたセマフォには多くのユースケースがあり、それはボックスの外側の考えの問題です。ミューテックスと追加のロジックを使用して解決するために使用されていた多くの問題は、セマフォを使用してより簡単かつ簡単に実装できます。 mutexはセマフォのサブセットです。つまり、mutexでできることはセマフォで行うことができます(単にcountを1に設定します)。しかし、セマフォ単独で行うことができることがありますミューテックスだけではできません。

最終的には、いずれかの同期プリミティブが一般的に何かを行うのに十分です(スレッド同期のために「チューリング完了」とし、その単語を束縛する)。しかし、それぞれが別のアプリケーションに合わせて調整されていますが、いくつかのカスタマイズと追加の接着剤を使用して入札を強制することができますが、別の同期プリミティブがジョブに適している可能性があります。

+3

オペレータは、セマフォ対ミューテックスをカウントせず、バイナリセマフォ対(常にバイナリ)ミューテックスについて質問していました。 –

3

私はバイナリセマフォを使用して、ロックなしで他のスレッドに信号を送ります。

同期要求の使用の簡単な例:

スレッド1

Semaphore sem; 
request_to_thread2(&sem); // Function sending request to thread2 in any fashion 
sem.wait();    // Waiting request complete 

スレッド2

Semaphore *sem; 
process_request(sem);  // Process request from thread 1 
sem->post();    // Signal thread 1 that request is completed 

注:スレッド2処理におけるポストセマフォ前追加の同期をせずにスレッド1のデータを安全に設定することができます。

関連する問題