Go で同時実行する goroutine 間の相互排他を実現するために、WaitGroups と Mutex をどのように使用できますか?

Barbara Streisand
リリース: 2024-11-03 22:02:03
オリジナル
353 人が閲覧しました

How can WaitGroups and Mutexes be used to achieve mutual exclusion between concurrent goroutines in Go?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!