goroutine を sync.WaitGroup とともに使用すると、一貫性のない結果が発生します

WBOY
リリース: 2024-02-09 10:30:10
転載
1021 人が閲覧しました

goroutine を sync.WaitGroup とともに使用すると、一貫性のない結果が発生します

Go 言語では、 goroutine を使用してタスクを同時に実行できます。sync.WaitGroup は、 goroutine のグループの完了を待つために使用される同期メカニズムです。ただし、PHP Editor Banana は、場合によっては、sync.WaitGroup で goroutine を使用すると、一貫性のない結果が生じる可能性があることを発見しました。この問題は複数のゴルーチンが同時にシェア変数を変更する場合によく発生しますが、ゴルーチンの実行順序が不定であるため、最終的な結果に不整合が生じる可能性があります。この記事では、この問題の原因を調査し、ゴルーチン間の結果の一貫性を確保するためのいくつかの解決策を提供します。

質問内容

ゴルーチン(Go言語)を使って、任意の整数i以下の素数の数を数えようとしています。 たとえば、i が 100 の場合、結果は 25 になります。

以下は私の現在の実装です:

リーリー

このプログラムを実行すると、より小さい i 値 (最大約 1000)

に対して正しい結果が得られます。

ただし、i の値が大きい場合、結果は一貫性がなく、不正確になります。

リーリー

#i の値が大きくなるにつれて結果のばらつきが大きくなります。これは何が原因でしょうか?一貫性を持たせて正しくする方法はありますか?

回避策

適切な同期が行われていない共有変数があります。競合状態が存在します (

*pr = 1)。共有変数の前後にミューテックスを追加すると修正されます (mu.Lock()、mu.Unlock())。

コード:

リーリー

出力:

リーリー

以上がgoroutine を sync.WaitGroup とともに使用すると、一貫性のない結果が発生しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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