web-dev-qa-db-ja.com

pthreadミューテックスとセマフォ

Pthreadライブラリが提供するセマフォとミューテックスの違いは何ですか?

70
cppdev

セマフォには同期化されたカウンタがあり、ミューテックスは単なるバイナリ(true/false)です。

セマフォは、多くの場合、リソースの要素がいくつ使用されているかを決定する決定的なメカニズムとして使用されます。たとえば、n個のワーカースレッドを表すオブジェクトは、セマフォを使用して使用可能なワーカースレッドの数をカウントします。

真実は、ミューテックスによって同期されるINTによってセマフォを表すことができるということです。

76
Hassan Syed

Mutex対Binary-Semaphoreについてお話します。明らかに、mutexを使用して、あるスレッドのデータが別のスレッドから同時にアクセスされるのを防ぎます。

(lock()を呼び出したばかりで、データにアクセスしていると仮定します。これは、他のスレッド(または同じスレッドコードの別のインスタンス)が、同じミューテックス。つまり、同じスレッドコードが別のスレッドインスタンスで実行されている場合、ロックをヒットすると、lock()は制御フローをブロックする必要があります。

これは、異なるスレッドコードを使用し、同じデータにアクセスし、同じミューテックスによってロックされているスレッドに適用されます。

この場合、あなたはまだデータにアクセスするプロセスにあり、ミューテックスロック解除に到達するまでにさらに15秒かかることがあります(そのため、ミューテックスロックでブロックされている他のスレッドはブロックを解除し、コントロールがデータにアクセスします)。

別のスレッドが同じミューテックスのロックを解除することを許可し、次に、ミューテックスロックで既に待機(ブロック)しているスレッドがデータのブロックを解除してアクセスできるようにしますか? (私がここで言っていることを手に入れてください。)

合意された普遍的な定義に従って、

  • 「mutex」ではこれは起こりえません。他のスレッドはあなたのスレッドのロックを解除できません
  • 「バイナリセマフォ」では、これが発生する可能性があります。他のスレッドはスレッドのロックを解除できます

したがって、ミューテックスの代わりにバイナリセマフォを使用することに非常にこだわりがある場合は、ロックとロック解除の「スコープ」に非常に注意する必要があります。つまり、すべてのロックにヒットするすべての制御フローは、 「最初のロック解除」はなく、常に「最初のロック」でなければなりません。

18
Paxi

mutexは、複数のスレッド間の競合状態を回避するために使用されます。

一方、セマフォは、複数のプロセスで使用される同期要素として使用されます。

mutexをバイナリセマフォに置き換えることはできません。1つのプロセスがセマフォを待機し、他のプロセスがセマフォを解放するためです。 mutexの取得と解放の両方が同じで処理される場合。

7
C Learner

トイレの例

ミューテックス:

トイレの鍵です。その時、一人が鍵を手に入れることができます-トイレを占有します。終了すると、その人はキュー内の次の人にキーを渡します(解放します)。

「Mutexは通常、複数のスレッドで同時に実行できないリエントラントコードのセクションへのアクセスをシリアル化するために使用されます。mutexオブジェクトは、1つのスレッドのみを制御セクションに入れ、そのセクションへのアクセスを試みる他のスレッドを強制します最初のスレッドがそのセクションから終了するまで待機します。」

(ミューテックスは実際には値1のセマフォです。)

セマフォ:

無料の同一トイレキーの数です。たとえば、同じ鍵と鍵を持つ4つのトイレがあるとします。セマフォカウント-キーのカウント-は開始時に4に設定され(4つのトイレはすべて無料)、カウント値は人々が入ってくるとデクリメントされます。空きキーが残っていない場合、セマフォカウントは0です。 1人がトイレを離れ、セマフォが1(無料のキー1つ)に増え、キュー内の次の人に与えられます。

「セマフォは、共有リソースの同時ユーザーの数を最大数に制限します。スレッドはリソースへのアクセスを要求(セマフォをデクリメント)でき、リソースの使用が終了したことを通知(セマフォをインクリメント)できます。」

ソース

4
Ankur

semaphoremutexの違いは、メカニズムパターンの違いです。違いは、それらの目的(意図)とそれらがどのように機能するか(-動作)です。

mutexbarrierpipelineは、並列プログラミングパターンです。 Mutexを使用して(intendedcritical sectionを保護し、mutual exclusionを確保します。 Barrierは、エージェント(スレッド/プロセス)がお互いを待ち続けるようにします。

mutexパターンの機能(behavior)の1つは、許可されたエージェント(プロセスまたはスレッド)のみがクリティカルセクションに入ることができ、そのエージェントのみが自発的に脱出できることです。その。

mutexが一度に1つのエージェントを許可する場合があります。複数のエージェント(複数のリーダー)を許可し、他のエージェント(ライター)を許可しない場合があります。

semaphoreは、さまざまなパターンを実装するために使用できるメカニズムです(intended)。これは、(動作)一般的にフラグ(相互排除によって保護されている可能性があります)です。 (1つの興味深い事実は、mutexパターンでさえセマフォの実装に使用できることです)。

大衆文化では、semaphoresはカーネルによって提供されるメカニズムであり、mutexesはユーザー空間ライブラリによって提供されます。

semaphoresmutexesについて誤解があることに注意してください。 semaphoresにはsynchronizationが使用されると書かれています。 mutexesにはownershipがあります。これは、人気のあるOSの本によるものです。しかし、真実はすべてのミューテックス、セマフォ、およびバリアが同期に使用されることです。 mutexの意図はownershipではなくmutual exclusionです。この誤解により、mutexesbinary-semaphoresの違いを尋ねる一般的なインタビューの質問が増えました。

概要、

  • ミューテックス、相互排除
  • セマフォ、並列設計パターンの実装
  • ミューテックス、許可されたエージェントのみがクリティカルセクションに入り、それだけが終了できます
  • セマフォ、フラグにgoと表示されている場合は入力し、そうでない場合は誰かがフラグを変更するまで待ちます

設計の観点では、mutexstate-patternに似ており、状態によって選択されたアルゴリズムが状態を変更できます。 binary-semaphorestrategy-patternに似ており、外部アルゴリズムが状態を変更し、最終的に実行するために選択されたアルゴリズム/戦略を変更できます。

3
shuva

この2つの記事では、 mutex vs semaphores また this stack overflow answerは同様の答えを示します。

3
tsenapathy

セマフォはフラグとしてより多く使用され、そのために本当にRTOS/OSを持ち込む必要はありません。セマフォは他のスレッドによって誤って、または故意に変更される可能性があります。スレッドはmutexを使用し、リソースを所有します。リソースが解放されるまで、他のスレッドはアクセスできません。

1
ajinkya

ミューテックスは単一プロセスのスレッドにのみ適用でき、セマフォのようにプロセス間では機能しません。

0
batteringRam