WaitGroup を使用した同時実行ゴルーチンの相互排除
コードには、実行中に互いに干渉せずに実行する必要がある 3 つの同時実行ゴルーチンがあります。コードの特定のセクション。この概念は相互排他として知られており、一度に 1 つの goroutine だけがコードの重要なセクションを実行できるようにします。
WaitGroup を使用して相互排他を実現するには、次の手順に従います。
上記の手順を実装する例を次に示します。
<code class="go">package main import ( "fmt" "sync" ) var ( mutex1 sync.Mutex mutex2 sync.Mutex mutex3 sync.Mutex wg sync.WaitGroup ) func Routine1() { mutex1.Lock() defer mutex1.Unlock() // Do something for i := 0; i < 200; i++ { mutex2.Lock() mutex3.Lock() fmt.Println("value of z") mutex2.Unlock() mutex3.Unlock() } // Do something } func Routine2() { mutex2.Lock() defer mutex2.Unlock() // Do something for i := 0; i < 200; i++ { mutex1.Lock() mutex3.Lock() fmt.Println("value of z") mutex1.Unlock() mutex3.Unlock() } // Do something } func Routine3() { mutex3.Lock() defer mutex3.Unlock() // Do something for i := 0; i < 200; i++ { mutex1.Lock() mutex2.Lock() fmt.Println("value of z") mutex1.Unlock() mutex2.Unlock() } // Do something } func main() { wg.Add(3) go Routine1() go Routine2() go Routine3() wg.Wait() }</code>
この例では各ゴルーチンの重要なセクションは、fmt.Println("value of z") を実行するループです。ミューテックスにより、一度に 1 つの goroutine だけがこのセクションを実行できるようになります。 WaitGroup は、メインの goroutine がすべての goroutine が完了するまで待機してから終了するようにします。
以上がWaitGroup を使用して同時ゴルーチンで相互排他を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。