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

WaitGroup を使用して同時ゴルーチンで相互排他を実現するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 13:57:02283ブラウズ

How can I achieve mutual exclusion in concurrent goroutines using WaitGroup?

WaitGroup を使用した同時実行ゴルーチンの相互排除

コードには、実行中に互いに干渉せずに実行する必要がある 3 つの同時実行ゴルーチンがあります。コードの特定のセクション。この概念は相互排他として知られており、一度に 1 つの goroutine だけがコードの重要なセクションを実行できるようにします。

WaitGroup を使用して相互排他を実現するには、次の手順に従います。

  1. 同時実行ゴルーチンごとにミューテックスを作成する: ミューテックスは、一度に 1 つのゴルーチンのみがロックを取得できるようにするロック メカニズムです。クリティカル セクションを排他的に実行する必要があるゴルーチンごとに個別のミューテックスを作成します。
  2. クリティカル セクションに入る前にミューテックスを取得します: 各ゴルーチンでコードのクリティカル セクションを実行する前に、対応するミューテックスの Lock() メソッド。この操作は、ミューテックスが取得されるまでゴルーチンをブロックします。
  3. クリティカル セクションを離れた後にミューテックスを解放する: クリティカル セクションの実行が完了したら、Unlock() を呼び出してミューテックスを解放します。方法。これにより、他のゴルーチンがミューテックスを取得してクリティカル セクションに入ることができるようになります。
  4. Use WaitGroup to Wait for Completion: すべてのゴルーチンの完了を追跡するために WaitGroup を作成します。各ゴルーチンは、実行完了後に WaitGroup の Done() メソッドを呼び出す必要があります。メインの goroutine は、WaitGroup の Wait() メソッドを使用して、すべての goroutine が完了するまで待機する必要があります。

上記の手順を実装する例を次に示します。

<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。