ホームページ >バックエンド開発 >Golang >WaitGroup が存在するにもかかわらずゴルーチンが中断されたように見える

WaitGroup が存在するにもかかわらずゴルーチンが中断されたように見える

PHPz
PHPz転載
2024-02-06 09:06:07962ブラウズ

尽管存在 WaitGroup,Goroutines 似乎还是被中断了

質問内容

waitgroup が存在するにもかかわらず goroutine が終了しないという問題があります。添付のコードでは、ヒープ順列アルゴリズムの実装を確認できます。処理を高速化したかったので、考えられる最初の数値ごとに goroutine を作成し、各 goroutine の順列を (n-1)! に減らしました。全体として、#n! の順列 (n*(n-1)!= n!) がまだあるはずですが、メイン ルーチンはサブルーチンの Exit より前に終了しているようです。次に、実行された置換を追跡しようとします。私の考えに反して、実行される置換の数は一定ではなく、常に n! # の下である程度 (n が低い場合)、またはかなり (n# が大きい場合) 発生します。 #)。 たとえば

n=4

毎回の順列は 24、つまり 4! になるため、すべてのゴルーチンが終了します。これより大きな数値、たとえば n=8 を指定した場合、予想される 40000 = 8! ではなく、13500 付近の値が得られます。 この動作はどこから来たのでしょうか?メインプログラムが終了する前にすべてのゴルーチンが完了していることを確認するにはどうすればよいでしょうか?

リーリー

(同じ動作は https://go.dev/play/ などで簡単に実現できるため、再現性が非常に高いです。)

正解

コードでは、ゴルーチンは
permutations

変数にもアクセスします。 n の値を増やすと、作業量が増加し、予期しない結果につながる問題が発生する可能性があります。

mutex

を使用すると、一度に 1 つの goroutine だけが permutations にアクセスできるようになります。 リーリー

以上がWaitGroup が存在するにもかかわらずゴルーチンが中断されたように見えるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。