waitgroup が存在するにもかかわらず goroutine が終了しないという問題があります。添付のコードでは、ヒープ順列アルゴリズムの実装を確認できます。処理を高速化したかったので、考えられる最初の数値ごとに goroutine を作成し、各 goroutine の順列を (n-1)!
に減らしました。全体として、#n! の順列 (
n*(n-1)!= n!) がまだあるはずですが、メイン ルーチンはサブルーチンの Exit より前に終了しているようです。次に、実行された置換を追跡しようとします。私の考えに反して、実行される置換の数は一定ではなく、常に
n! # の下である程度 (
n が低い場合)、またはかなり (
n# が大きい場合) 発生します。 #)。
たとえば
毎回の順列は 24、つまり 4!
になるため、すべてのゴルーチンが終了します。これより大きな数値、たとえば n=8
を指定した場合、予想される 40000 = 8!
ではなく、13500
付近の値が得られます。
この動作はどこから来たのでしょうか?メインプログラムが終了する前にすべてのゴルーチンが完了していることを確認するにはどうすればよいでしょうか?
(同じ動作は https://go.dev/play/ などで簡単に実現できるため、再現性が非常に高いです。)
正解 変数にもアクセスします。 n
の値を増やすと、作業量が増加し、予期しない結果につながる問題が発生する可能性があります。
を使用すると、一度に 1 つの goroutine だけが permutations
にアクセスできるようになります。
リーリー
以上がWaitGroup が存在するにもかかわらずゴルーチンが中断されたように見えるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。