ホームページ  >  記事  >  セマフォとミューテックスの違いは何ですか

セマフォとミューテックスの違いは何ですか

青灯夜游
青灯夜游オリジナル
2021-11-08 14:24:3918480ブラウズ

違い: 1. ミューテックスはスレッドの相互排他に使用され、セマフォはスレッドの同期に使用されます; 2. ミューテックス値は 0 または 1 のみにすることができ、セマフォ値は非負の整数にすることができます; 3ミューテックスのロックとロック解除はそれぞれ同じスレッドで使用する必要があり、セマフォはあるスレッドで解放し、別のスレッドで取得することができます。

セマフォとミューテックスの違いは何ですか

このチュートリアルの動作環境: Windows 7 システム、Dell G3 コンピューター。

ミューテックスとセマフォの違い

1. ミューテックスはスレッドの相互排他に使用され、セマフォはスレッドの同期に使用されます。

これは、ミューテックスとセマフォの基本的な違い、つまり、相互排他と同期の違いです。

相互排除: 同時に 1 人の訪問者のみがアクセスできる、一意かつ排他的なリソースを指します。ただし、相互排除では、訪問者がリソースにアクセスする順序を制限することはできません。つまり、アクセスには順序がありません。

同期: (ほとんどの場合) 相互排他に基づいた他のメカニズムを介した訪問者によるリソースへの秩序あるアクセスを指します。ほとんどの場合、特にリソースへのすべての書き込みが相互排他的である必要がある場合、同期ではすでに相互排他が実装されています。少数のケースでは、複数の訪問者が同時にリソースにアクセスできます (

2)。ミューテックス値は 0/1 のみ、セマフォ値は非負の整数です。

言い換えると、ミューテックスは 1 つのリソースへの相互排他的アクセスにのみ使用でき、複数のリソースのマルチスレッド相互排他を実装することはできません。セマフォは、複数の同様のリソースのマルチスレッド相互排他と同期を実現できます。セマフォが単一値セマフォの場合、リソースへの相互排他的アクセスも完了できます。

3. ミューテックスのロックとロック解除はそれぞれ同じスレッドで使用する必要があり、セマフォはあるスレッドで解放し、別のスレッドで取得できます。

Mutex (ミューテックス)

ミューテックスとは、相互排他現象を表現するデータ構造であり、バイナリセマフォとしても使用されます。ミューテックスは基本的に、複数のタスクの動作を同期するために使用できるマルチタスク対応のバイナリ信号であり、コードの重要なセクションを割り込みから保護したり、同期に使用されるリソースを共有したりするためによく使用されます。

セマフォとミューテックスの違いは何ですか

Mutex は本質的にロックであり、リソースへの排他的アクセスを提供するため、Mutex の主な機能は相互排他です。 Mutex オブジェクトの値は 0 と 1 の 2 つの値のみです。これら 2 つの値は、それぞれ Mutex の 2 つの状態も表します。値は 0 で、ロック状態を示します。現在のオブジェクトはロックされています。ユーザー プロセス/スレッドが重要なリソースをロックしようとすると、キューに入って待機します。値は 1 で、アイドル状態を示します。現在のオブジェクトはアイドル状態になり、ユーザー プロセス/スレッドが重要なリソースをロックできるようになります。その後、Mutex 値は 1 減少して 0 になります。

Mutex は 4 つの操作に抽象化できます:

-Create

-Lock

-Unlock

-DestroyDestroy

Mutex は、ミューテックスの作成時に、ミューテックスが作成後にロック状態にあるかアイドル状態にあるかを示す初期値を持つことができます。同じスレッド内では、デッドロックを防ぐために、システムはミューテックスを連続して 2 回ロックすることを許可しません (通常、システムは 2 回目の呼び出しの直後に戻ります)。言い換えれば、ロックとロック解除の 2 つの対応する操作は、同じスレッドで完了する必要があります。

さまざまなオペレーティング システムで提供されるミューテックス関数:

##mutex_initLock #CloseHandle

アクション/システム

Win32

Linyx

Solaris

作成

CreateMutex

##pthread_mutex_init

#WaitForSingleObject

#pthread_mutex_lock

mutex_lock

Unlock
ReleaseMutex

pthread_mutex_unlock

mutex_unlock

#破棄

#pthread_mutex_destroy

mutex_destroy

デッドロックは主に依存ロックが複数ある場合に発生し、あるスレッドが他のスレッドとは逆の順序でミューテックスをロックしようとした場合に発生します。デッドロックを回避する方法は、ミューテックスを使用する際に特に注意する必要があります。

一般に、暗黙の基本原則がいくつかあります。

共有リソースを操作する前に、ロックを取得する必要があります。

操作終了後は必ずロックを解除してください。

ロックを使用する時間はできるだけ短くしてください。

複数のロックがある場合、取得順序がABCチェーンロックの場合、解放順序もABCとなります。

スレッドがエラーで戻った場合、取得したロックを解放する必要があります。

おそらく読者の中には、「待機の一時停止」と「待機中のスレッドのウェイクアップ」の操作をどのように実装するかに興味がある人もいるでしょう。各ミューテックスには待機キューがあります。スレッドがミューテックスで待機したい場合は、まず自分自身を待機キューに追加し、次にスレッドのステータスをスリープに設定してから、スケジューラ関数を呼び出して別のスレッドに切り替える必要があります。スレッドが待機キュー内の他のスレッドをウェイクアップしたい場合は、待機キューからアイテムを取り出し、ステータスをスリープからレディに変更し、レディ キューに参加するだけで済みます。その後、次のウェイクアップ状態に切り替わります。スケジューラ関数が実行される時刻。

通常の状況では、同じスレッドがロックを 2 回呼び出した場合、2 回目の呼び出しでは、ロックがすでに占有されているため、スレッドはハングアップし、他のスレッドがロックを解放するのを待ちます。占有されているロックが単独で占有されている場合、スレッドはロックを解放する機会がなくサスペンドされ、常にサスペンド待ちの状態となり、これをデッドロックといいます。もう 1 つの典型的なデッドロック状況は次のとおりです。スレッド A がロック 1 を取得し、スレッド B がロック 2 を取得します。このとき、スレッド A はロックを呼び出してロック 2 を取得しようとします。その結果、スレッド A はハングしてスレッド B が解放されるまで待つ必要があります。このとき、スレッド B も lock を呼び出してロック 1 を取得しようとします。その結果、スレッド A がロック 1 を解放するまで待つ必要があるため、スレッド A とスレッド B は両方とも永久にサスペンド状態になります。より多くのスレッドとより多くのロックが関与すると、デッドロックの可能性の問題が複雑になり、判断が困難になることは想像に難くありません。

セマフォ

セマフォ (セマフォとも呼ばれます) は、マルチスレッド環境で使用される機能です。さまざまなスレッドを調整する役割を果たします。公共リソースを正しく合理的に使用します。

セマフォはいくつかのカテゴリに分類できます。

  • バイナリ セマフォ (バイナリ セマフォ): 値 0 または 1 を取ることができるのはセマフォだけです。同時に1つで使用できるスレッドを取得します。

  • 整数セマフォ (整数セマフォ): セマフォ値は整数であり、セマフォ値が 0 になるまで複数のスレッドによって同時に取得できます。

  • レコード セマフォ (レコード セマフォ): 整数値 (カウント) に加えて、各セマフォには、セマフォ上でブロックされている待機キュー リストもあります。各スレッド。セマフォが解放されて値が 1 つ増加すると、システムは待機キューから待機スレッドを自動的にウェイクアップしてセマフォを取得できるようにし、同時にセマフォが 1 つ減ります。

セマフォはカウンターを通じて共有リソースへのアクセスを制御します。セマフォの値は負ではない整数であり、それを渡すすべてのスレッドは整数を 1 つ減らします。カウンタが 0 より大きい場合はアクセスが許可され、カウンタは 1 減算されます。0 の場合はアクセスが禁止され、アクセスを試みるすべてのスレッドは待機状態になります。

カウンタ計算の結果は、共有リソースへのアクセスが許可されるパスです。したがって、共有リソースにアクセスするには、スレッドはセマフォからパスを取得する必要があります。セマフォのカウントが 0 より大きい場合、このスレッドはパスを取得し、セマフォのカウントがデクリメントされます。それ以外の場合、このスレッドはパスを取得します。パスが出るまでブロックします。このスレッドが共有リソースにアクセスする必要がなくなったら、パスを解放します。これにより、セマフォのカウントが増加します。別のスレッドがパスを待っている場合、そのスレッドがその時点でパスを取得します。

セマフォは 5 つの操作に抽象化できます:

  • - Create Create

  • - Wait for Wait:

    スレッドはセマフォを待ちます。値が 0 より大きい場合はセマフォが取得され、値が 1 減ります。値が 0 にのみ等しい場合、スレッドはセマフォ値が 0 より大きくなるまでスリープ状態に入ります。またはタイムアウトになります。

  • -Release Post

    はセマフォの解放を実行し、値が 1 つ増加します。この時点で待機中のスレッドがある場合は、スレッドが起動されます。 。

  • -TryWait を待機しようとしています

    TryWait が呼び出された場合、スレッドは実際にはセマフォを取得しませんが、セマフォを取得できるかどうかを確認します。値が 0 より大きい場合、TryWait は成功を返し、それ以外の場合は失敗を返します。 ############-破壊する###

セマフォは 2 つ以上のキー コード セグメントを保護するために使用できますが、これらのキー コード セグメントを同時に呼び出すことはできません。コードの重要なセクションに入る前に、スレッドはセマフォを取得する必要があります。コードのクリティカル セクションにスレッドがない場合、スレッドはすぐにブロック図のその部分に入ります。コードの重要なセクションが完了したら、スレッドはセマフォを解放する必要があります。この重要なコード セクションに入ろうとする他のスレッドは、最初のスレッドがセマフォを解放するまで待つ必要があります。このプロセスを完了するには、セマフォを作成し、各キーコードセグメントの先頭と末尾に「セマフォ取得」VIと「セマフォ解放」VIを配置する必要があります。これらのセマフォ VI が最初に作成されたセマフォを参照していることを確認してください。

#セマフォの作成WaitForSingleObjectsem _trywait#CloseHandle

アクション/システム

Win32

POSIX

#作成

##sem_init

#待機
単一オブジェクト待機

sem _wait

Release
ReleaseMutex

sem _post

# #待ってみてください

Destroy

sem_destroy

#関連知識の詳細については、次のサイトをご覧ください。

FAQ

セクション!

以上がセマフォとミューテックスの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。