外部関数で sync.WaitGroup を使用するときにデッドロックを回避するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-06 05:06:02
オリジナル
592 人が閲覧しました

How to Avoid Deadlock When Using sync.WaitGroup with an External Function?

外部関数による sync.WaitGroup の最適な使用

問題:

同期の実装。外部関数を使用した WaitGroup は、1 から 11 までの数字を出力しようとするとデッドロックを引き起こします。具体的には、wg.Wait() 行でエラーが発生します。

解決策 1 (間違ったアプローチ):

wg.Add(1) を 2 の代わりに設定することは、根本的な問題に対処していないため、間違った解決策です。

解決策 2 (改善されたアプローチ):

コードを次のように変更します。

  • main 関数で、&wg を使用して sync.WaitGroup のアドレスを Print 関数に渡します。
  • wg を削除します。
<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)

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

    wg.Wait() //deadlock here
}                

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

説明:

wg のアドレスを Print に渡すと、同じ WaitGroup インスタンスが操作されることが保証されます。 Print 関数のシグネチャから wg を削除すると、関数が外部の WaitGroup について知る必要がなくなります。

結論:

2 番目の解決策は、次のような問題を回避する、より堅牢なアプローチです。デッドロックを回避し、wg からの Print 関数の独立性を維持します。

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

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