ホームページ > バックエンド開発 > Golang > 外部関数で `sync.WaitGroup` を使用するとデッドロックが発生するのはなぜですか?

外部関数で `sync.WaitGroup` を使用するとデッドロックが発生するのはなぜですか?

Linda Hamilton
リリース: 2024-11-06 00:50:02
オリジナル
874 人が閲覧しました

Why does using `sync.WaitGroup` with external functions lead to a deadlock?

外部関数で sync.WaitGroup を使用するためのベスト プラクティス

提供されたコード スニペットでは、同期を利用しようとするとデッドロックが発生します。 .WaitGroup と外部関数。このエラーは、WaitGroup のコピーを外部関数に誤って渡し、目的の WaitGroup で Done() メソッドが呼び出されないことが原因で発生します。

この問題に対処するには、必ず、代わりに WaitGroup を使用してください。これにより、外部関数は正しい WaitGroup にアクセスし、Done() を適切に呼び出すことができます。修正されたコードは次のとおりです。

<code class="go">package main

import (
    "fmt"
    "sync"
)

func main() {
    ch := make(chan int)

    var wg sync.WaitGroup
    wg.Add(2)

    go Print(ch, &wg) // Pass a pointer to the WaitGroup

    go func() {
        for i := 1; i <= 11; i++ {
            ch <- i
        }
        close(ch)
        defer wg.Done()
    }()

    wg.Wait() // Wait for both goroutines to finish
}

func Print(ch <-chan int, wg *sync.WaitGroup) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
    defer wg.Done()
}</code>
ログイン後にコピー

また、以下に示すように、Print 関数のシグネチャを変更して WaitGroup パラメーターを削除することもできます。

<code class="go">func Print(ch <-chan int) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
}</code>
ログイン後にコピー

この場合、Print 関数は関数は、完了時に WaitGroup を閉じる責任があります。このアプローチは、外部関数が WaitGroup に直接アクセスする必要がないシナリオで推奨されます。

以上が外部関数で `sync.WaitGroup` を使用するとデッドロックが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート