ミューテックス ロックによる同時実行ゴルーチンの相互排除
コード内で、各ゴルーチンの特定のコード セクションが分離して実行されるようにする必要があります。 。これにより、他のゴルーチンによるこれらのセクションの同時実行が防止されます。ここでは、ミューテックス ロックを使用して相互排他を実現する方法を示します。
提供されたコードの概要は、ゴルーチンのフローと相互排他の必要性を示しています。 1 つの goroutine で特定のイベントが実行されている間、実行が他の goroutine に渡されるのを防ぎたいとします。
これを実装するには、ミューテックス ロックを使用できます。ミューテックスにより、常に 1 つの goroutine だけが共有リソースにアクセスできるようになります。以下は、相互排他にミューテックスを利用するコードを少し変更したバージョンです:
<code class="go">package main import ( "fmt" "rand" "sync" ) var ( mutex1, mutex2, mutex3 sync.Mutex wg sync.WaitGroup ) func Routine1() { mutex1.Lock() // Do something for i := 0; i < 200; i++ { mutex2.Lock() mutex3.Lock() fmt.Println("Value of z") mutex2.Unlock() mutex3.Unlock() } // Do something mutex1.Unlock() wg.Done() } func Routine2() { mutex2.Lock() // Do something for i := 0; i < 200; i++ { mutex1.Lock() mutex3.Lock() fmt.Println("Value of z") mutex1.Unlock() mutex3.Unlock() } // Do something mutex2.Unlock() wg.Done() } func Routine3() { mutex3.Lock() // Do something for i := 0; i < 200; i++ { mutex1.Lock() mutex2.Lock() fmt.Println("Value of z") mutex1.Unlock() mutex2.Unlock() } // Do something mutex3.Unlock() wg.Done() } func main() { wg.Add(3) go Routine1() go Routine2() Routine3() wg.Wait() }</code>
この更新されたコードが相互排他を実現する方法は次のとおりです:
この実装により、各ゴルーチンの指定されたコード セクションが分離して実行され、他のゴルーチンからの同時実行が防止されます。
以上がMutex ロックを使用して同時 Goroutine で相互排他を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。