ホームページ > バックエンド開発 > Golang > ミューテックスを使用して同時ゴルーチンで相互排除を実現するにはどうすればよいでしょうか?

ミューテックスを使用して同時ゴルーチンで相互排除を実現するにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2024-10-30 05:50:28
オリジナル
673 人が閲覧しました

How can you achieve mutual exclusion in concurrent Goroutines using Mutexes?

Mutex を使用した同時ゴルーチンでの相互排除

相互排除の概念は、プログラム内の関数またはコードブロックの同時実行を制御します。複数のルーチンが独立して実行される同時プログラミング環境では、相互排他を維持することが正確性を確保し、競合を防ぐために非常に重要です。

問題:
3 つの同時ゴルーチン (ルーチン) があるシナリオを考えてみましょう。 1、2、3) はデータを交換し、印刷操作を実行します。目標は、任意の goroutine のコードの特定のセクションが実行されている間、このセクションが完了するまで他の goroutine の実行が停止されるようにすることです。

Mutex を使用した解決策:
Mutexes 、基本的な同期プリミティブを使用して、ゴルーチンで相互排他を実現できます。ミューテックスは、一度に 1 つのゴルーチンのみがコードの重要なセクションにアクセスできるようにするロック メカニズムを提供します。

提供されたコード スニペットでは、3 つのミューテックス (mutex1、mutex2、および mutex3) が導入されています。

var (
    mutex1, mutex2, mutex3 sync.Mutex
    wg sync.WaitGroup
)
ログイン後にコピー

各ゴルーチンは、改訂されたコードに示すように、クリティカル セクションを実行する前に適切なミューテックスを取得します。

func Routine1() {
    mutex1.Lock()
    // do something
    ...
    // do something
    mutex1.Unlock()
    ...
}

func Routine2() {
    mutex2.Lock()
    ...
    // do something
    ...
    mutex2.Unlock()
    ...
}

func Routine3() {
    ...
    mutex3.Lock()
    // do something
    ...
    mutex3.Unlock()
    ...
}
ログイン後にコピー
  • Routine1 は、クリティカル セクションの実行中にミューテックス 1 を取得し、他のルーチンの実行をブロックします。このセクションにアクセスします。
  • Routine2 は mutex2 を取得し、そのクリティカル セクションの排他的実行を保証します。
  • Routine3 は mutex3 を取得して、そのクリティカル セクションへのアクセスを制御します。

待機グループと同期:
さらに、待機グループ (wg) を使用してゴルーチンを同期しています:

wg.Add(3)
go Routine1()
go Routine2()
Routine3()
wg.Wait()
ログイン後にコピー
  • Add メソッドは待機グループのカウンターを 3 ずつ増分します。これは、3 つのゴルーチンが実行されようとしていることを示します。
  • go ステートメント запускает Routine1 と Routine2 を同時に実行します。
  • Routine3 は現在のスレッドで実行されます。
  • Wait メソッドは、次までブロックされます。待機グループ カウンタが 0 に達すると、メイン関数が続行する前にすべてのゴルーチンが実行を完了することが保証されます。

結果:
この実装では、次のクリティカル セクションの実行が行われます。ゴルーチンは相互に排他的になります。その結果、各ルーチンの印刷操作が重複したりインターリーブされたりすることがなくなり、競合状態が防止され、期待どおりの出力が生成されます。

以上がミューテックスを使用して同時ゴルーチンで相互排除を実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート