Pthreadライブラリが提供するセマフォとミューテックスの違いは何ですか?
セマフォには同期化されたカウンタがあり、ミューテックスは単なるバイナリ(true/false)です。
セマフォは、多くの場合、リソースの要素がいくつ使用されているかを決定する決定的なメカニズムとして使用されます。たとえば、n個のワーカースレッドを表すオブジェクトは、セマフォを使用して使用可能なワーカースレッドの数をカウントします。
真実は、ミューテックスによって同期されるINTによってセマフォを表すことができるということです。
Mutex対Binary-Semaphoreについてお話します。明らかに、mutexを使用して、あるスレッドのデータが別のスレッドから同時にアクセスされるのを防ぎます。
(lock()を呼び出したばかりで、データにアクセスしていると仮定します。これは、他のスレッド(または同じスレッドコードの別のインスタンス)が、同じミューテックス。つまり、同じスレッドコードが別のスレッドインスタンスで実行されている場合、ロックをヒットすると、lock()は制御フローをブロックする必要があります。
これは、異なるスレッドコードを使用し、同じデータにアクセスし、同じミューテックスによってロックされているスレッドに適用されます。
この場合、あなたはまだデータにアクセスするプロセスにあり、ミューテックスロック解除に到達するまでにさらに15秒かかることがあります(そのため、ミューテックスロックでブロックされている他のスレッドはブロックを解除し、コントロールがデータにアクセスします)。
別のスレッドが同じミューテックスのロックを解除することを許可し、次に、ミューテックスロックで既に待機(ブロック)しているスレッドがデータのブロックを解除してアクセスできるようにしますか? (私がここで言っていることを手に入れてください。)
合意された普遍的な定義に従って、
したがって、ミューテックスの代わりにバイナリセマフォを使用することに非常にこだわりがある場合は、ロックとロック解除の「スコープ」に非常に注意する必要があります。つまり、すべてのロックにヒットするすべての制御フローは、 「最初のロック解除」はなく、常に「最初のロック」でなければなりません。
mutexは、複数のスレッド間の競合状態を回避するために使用されます。
一方、セマフォは、複数のプロセスで使用される同期要素として使用されます。
mutexをバイナリセマフォに置き換えることはできません。1つのプロセスがセマフォを待機し、他のプロセスがセマフォを解放するためです。 mutexの取得と解放の両方が同じで処理される場合。
トイレの例
ミューテックス:
トイレの鍵です。その時、一人が鍵を手に入れることができます-トイレを占有します。終了すると、その人はキュー内の次の人にキーを渡します(解放します)。
「Mutexは通常、複数のスレッドで同時に実行できないリエントラントコードのセクションへのアクセスをシリアル化するために使用されます。mutexオブジェクトは、1つのスレッドのみを制御セクションに入れ、そのセクションへのアクセスを試みる他のスレッドを強制します最初のスレッドがそのセクションから終了するまで待機します。」
(ミューテックスは実際には値1のセマフォです。)
セマフォ:
無料の同一トイレキーの数です。たとえば、同じ鍵と鍵を持つ4つのトイレがあるとします。セマフォカウント-キーのカウント-は開始時に4に設定され(4つのトイレはすべて無料)、カウント値は人々が入ってくるとデクリメントされます。空きキーが残っていない場合、セマフォカウントは0です。 1人がトイレを離れ、セマフォが1(無料のキー1つ)に増え、キュー内の次の人に与えられます。
「セマフォは、共有リソースの同時ユーザーの数を最大数に制限します。スレッドはリソースへのアクセスを要求(セマフォをデクリメント)でき、リソースの使用が終了したことを通知(セマフォをインクリメント)できます。」
semaphore
とmutex
の違いは、メカニズムとパターンの違いです。違いは、それらの目的(意図)とそれらがどのように機能するか(-動作)です。
mutex
、barrier
、pipeline
は、並列プログラミングパターンです。 Mutex
を使用して(intended)critical section
を保護し、mutual exclusion
を確保します。 Barrier
は、エージェント(スレッド/プロセス)がお互いを待ち続けるようにします。
mutex
パターンの機能(behavior)の1つは、許可されたエージェント(プロセスまたはスレッド)のみがクリティカルセクションに入ることができ、そのエージェントのみが自発的に脱出できることです。その。
mutex
が一度に1つのエージェントを許可する場合があります。複数のエージェント(複数のリーダー)を許可し、他のエージェント(ライター)を許可しない場合があります。
semaphore
は、さまざまなパターンを実装するために使用できるメカニズムです(intended)。これは、(動作)一般的にフラグ(相互排除によって保護されている可能性があります)です。 (1つの興味深い事実は、mutex
パターンでさえセマフォの実装に使用できることです)。
大衆文化では、semaphores
はカーネルによって提供されるメカニズムであり、mutexes
はユーザー空間ライブラリによって提供されます。
semaphores
とmutexes
について誤解があることに注意してください。 semaphores
にはsynchronization
が使用されると書かれています。 mutexes
にはownership
があります。これは、人気のあるOSの本によるものです。しかし、真実はすべてのミューテックス、セマフォ、およびバリアが同期に使用されることです。 mutexの意図はownership
ではなくmutual exclusion
です。この誤解により、mutexes
とbinary-semaphores
の違いを尋ねる一般的なインタビューの質問が増えました。
概要、
設計の観点では、mutex
はstate-pattern
に似ており、状態によって選択されたアルゴリズムが状態を変更できます。 binary-semaphore
はstrategy-pattern
に似ており、外部アルゴリズムが状態を変更し、最終的に実行するために選択されたアルゴリズム/戦略を変更できます。
この2つの記事では、 mutex vs semaphores また this stack overflow answerは同様の答えを示します。
セマフォはフラグとしてより多く使用され、そのために本当にRTOS/OSを持ち込む必要はありません。セマフォは他のスレッドによって誤って、または故意に変更される可能性があります。スレッドはmutexを使用し、リソースを所有します。リソースが解放されるまで、他のスレッドはアクセスできません。
ミューテックスは単一プロセスのスレッドにのみ適用でき、セマフォのようにプロセス間では機能しません。