目次
ミューテックスとセマフォの違い
Mutex (ミューテックス)
セマフォ
ホームページ よくある問題 セマフォとミューテックスの違いは何ですか

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

Nov 08, 2021 pm 02:24 PM
ミューテックス 信号量

違い: 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

8コア16スレッドとはどういう意味ですか? 8コア16スレッドとはどういう意味ですか? Feb 02, 2023 am 11:26 AM

8 コアは、CPU に 8 つの物理コアがあることを意味し、16 スレッドは、CPU が同時にタスクを処理できる最大 16 のスレッドを持つことができることを意味します。コアとスレッドの数は、コンピュータ CPU の重要なパフォーマンス指標です。CPU のコア数が多いほど、処理速度は高くなります。スレッドの数が多いほど、複数のプログラムを同時に実行しやすくなります。スレッドの数は、ある瞬間に CPU が同時に実行できる数、つまり並列処理されるタスクの数に相当するためです。マルチスレッドにより、広範囲にわたる問題の順序が狂ったスーパースカラー処理を最大化し、プロセッサ コンピューティング コンポーネントの利用率を向上させ、データ相関やキャッシュ ミスによって引き起こされるメモリ アクセスの遅延を軽減できます。

PHP プログラムにおけるミューテックスのベスト プラクティス PHP プログラムにおけるミューテックスのベスト プラクティス Jun 07, 2023 pm 12:40 PM

時代の進歩とテクノロジーの継続的な更新に伴い、Web アプリケーションの需要は増加しており、PHP プログラムは多くの Web アプリケーションの主要なプログラミング言語の 1 つになりました。マルチスレッド Web アプリケーションでは、プログラムが正しく実行されるように、同時実行性と競合状態を考慮する必要があります。 PHP プログラムでは、ミューテックスはスレッドの安全性とデータ転送の正確性を確保するためのソリューションを提供します。この記事では、PHP プログラムにおけるミューテックスのベスト プラクティスについて説明します。ミューテックスとは何ですか?ミューテックスはスレッドが確実に実行されるようにするために使用されます。

C++ 同時プログラミング: スレッドの枯渇と優先順位の逆転を回避するには? C++ 同時プログラミング: スレッドの枯渇と優先順位の逆転を回避するには? May 06, 2024 pm 05:27 PM

スレッドの枯渇を回避するには、公平なロックを使用してリソースの公平な割り当てを確保するか、スレッドの優先順位を設定します。優先順位の逆転を解決するには、リソースを保持しているスレッドの優先順位を一時的に高める優先順位の継承を使用するか、リソースを必要とするスレッドの優先順位を高めるロック プロモーションを使用します。

C++ 同時プログラミング: スレッドの終了とキャンセルを行うには? C++ 同時プログラミング: スレッドの終了とキャンセルを行うには? May 06, 2024 pm 02:12 PM

C++ のスレッド終了およびキャンセル メカニズムには次のものがあります。 スレッド終了: std::thread::join() は、ターゲット スレッドが実行を完了するまで現在のスレッドをブロックします。 std::thread::detach() は、ターゲット スレッドをスレッド管理から切り離します。スレッドのキャンセル: std::thread::request_termination() はターゲット スレッドに実行の終了を要求します。 std::thread::get_id() はターゲット スレッド ID を取得し、std::terminate() とともに使用してターゲットを即座に終了できます。糸。実際の戦闘では、request_termination() によってスレッドが終了のタイミングを決定でき、join() によってメインラインでそれが保証されます。

プログラム実行時の命令フローの最小単位は何ですか? プログラム実行時の命令フローの最小単位は何ですか? Aug 23, 2022 pm 02:16 PM

「スレッド」とは、プログラムを実行する際の命令の流れの最小単位です。プロセスは特定の独立した機能を持つプログラムを指し、スレッドはプロセスの一部であり、命令フローの実行状態を記述します。スレッドはプロセス内の命令実行フローの最小単位であり、基本単位です。 CPU のスケジューリング。スレッドはタスク (プログラムセグメント) の実行プロセスであり、メモリ空間を占有せず、プロセスのメモリ空間に含まれます。同じプロセス内では、複数のスレッドがプロセスのリソースを共有し、プロセスには少なくとも 1 つのスレッドがあります。

Java エラー: JavaFX スレッドスタックエラー、対処方法と回避方法 Java エラー: JavaFX スレッドスタックエラー、対処方法と回避方法 Jun 24, 2023 pm 05:52 PM

JavaFX アプリケーションの開発中に、JavaFX スレッドスタックエラーが頻繁に発生します。このようなエラーは重大度が異なり、プログラムの安定性やパフォーマンスに悪影響を与える可能性があります。プログラムが正常に動作することを保証するには、JavaFX スレッドスタックエラーの原因と解決策、およびこのエラーの発生を防ぐ方法を理解する必要があります。 1. JavaFX スレッドスタックエラーの原因 JavaFX はマルチスレッド UI アプリケーション フレームワークであり、バックグラウンド スレッドでプログラムを長時間実行できます。

Go言語のコルーチンとスレッドの違いは何ですか Go言語のコルーチンとスレッドの違いは何ですか Feb 02, 2023 pm 06:10 PM

違い: 1. スレッドは複数のコルーチンを持つことができ、プロセスは複数のコルーチンを単独で持つこともできます; 2. スレッドは同期メカニズムですが、コルーチンは非同期です; 3. コルーチンは最後の呼び出しの状態を保持できますが、スレッドは機能しません; 4. スレッドはプリエンプティブですが、コルーチンは非プリエンプティブです; 5. スレッドは分割された CPU リソースであり、コルーチンは組織化されたコード プロセスです コルーチンはホストして実行するためにスレッドを必要とします。

Go言語におけるスレッドとプロセスの違いの分析 Go言語におけるスレッドとプロセスの違いの分析 Apr 03, 2024 pm 01:39 PM

Go 言語のプロセスとスレッド: プロセス: 独自のリソースとアドレス空間を持つ独立して実行されるプログラム インスタンス。スレッド: プロセス リソースとアドレス空間を共有するプロセス内の実行ユニット。特徴: プロセス: 高いオーバーヘッド、良好な分離、独立したスケジューリング。スレッド: 低いオーバーヘッド、共有リソース、内部スケジューリング。実際のケース: プロセス: 長時間実行されるタスクを分離します。スレッド: 大量のデータを同時に処理します。