相互排除の概念は、プログラム内の関数またはコードブロックの同時実行を制御します。複数のルーチンが独立して実行される同時プログラミング環境では、相互排他を維持することが正確性を確保し、競合を防ぐために非常に重要です。
問題:
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() ... }
待機グループと同期:
さらに、待機グループ (wg) を使用してゴルーチンを同期しています:
wg.Add(3) go Routine1() go Routine2() Routine3() wg.Wait()
結果:
この実装では、次のクリティカル セクションの実行が行われます。ゴルーチンは相互に排他的になります。その結果、各ルーチンの印刷操作が重複したりインターリーブされたりすることがなくなり、競合状態が防止され、期待どおりの出力が生成されます。
以上がミューテックスを使用して同時ゴルーチンで相互排除を実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。