WaitGroup と Mutex を使用した同時ゴルーチンの相互排他
Go で同時ゴルーチンの相互排他を実現するには、一度に 1 つのゴルーチンのみを使用します。特定のコードを実行できる場合は、WaitGroup とミューテックスの組み合わせを活用できます。
WaitGroup は、先に進む前にゴルーチンのグループが実行を完了するのを待つことを可能にする同期プリミティブです。一方、ミューテックスは相互排他ロック メカニズムを提供し、コードの重要なセクションが複数のゴルーチンによって同時に実行されないようにします。
次のコード例を考えてみましょう:
<code class="go">package main import ( "fmt" "rand" "sync" ) var ( mutex1, mutex2, mutex3 sync.Mutex wg sync.WaitGroup ) func Routine1() { mutex1.Lock() defer mutex1.Unlock() // Ensure mutex is always unlocked before returning // do something // Sending and printing events should be mutually exclusive for i := 0; i < 200; i++ { mutex2.Lock() defer mutex2.Unlock() mutex3.Lock() defer mutex3.Unlock() fmt.Println("value of z") } // do something } func Routine2() { mutex2.Lock() defer mutex2.Unlock() // do something // Sending and printing events should be mutually exclusive for i := 0; i < 200; i++ { mutex1.Lock() defer mutex1.Unlock() mutex3.Lock() defer mutex3.Unlock() fmt.Println("value of z") } // do something } func Routine3() { mutex3.Lock() defer mutex3.Unlock() // do something // Sending and printing events should be mutually exclusive for i := 0; i < 200; i++ { mutex1.Lock() defer mutex1.Unlock() mutex2.Lock() defer mutex2.Unlock() fmt.Println("value of z") } // do something } func main() { wg.Add(3) go Routine1() go Routine2() Routine3() wg.Wait() // Wait for all goroutines to complete }</code>
このコードには、特定の操作を同時に実行する 3 つの個別のゴルーチン (Routine1、Routine2、および Routine3) があります。ただし、コードの特定のセクション (送信イベントと印刷イベント) が他のゴルーチンからの干渉なしに実行されるようにしたいと考えています。
これは、ミューテックスを利用することで実現します。 3 つのミューテックス (mutex1、mutex2、および mutex3) を定義し、クリティカル セクションを実行する前に適切なミューテックスのロックを取得します。ミューテックスが 1 つのゴルーチンによってロックされている場合、同じロックを取得しようとする他のゴルーチンは、そのロックが使用可能になるまでブロックされます。
適切なミューテックスをロックおよびロック解除することで、1 つのゴルーチンのみがクリティカル セクションを実行できるようになります。いつでも。これにより、これらのコード セクションの同時実行が防止され、ゴルーチン間の相互排他が維持されます。
最後に、WaitGroup を使用して、3 つのゴルーチンすべての実行が完了するまで main 関数が終了しないようにします。これにより、ゴルーチンを同期し、プログラムのフローを制御できるようになります。
以上がGo で同時実行する goroutine 間の相互排他を実現するために、WaitGroups と Mutex をどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。