コードを実行すると、攻撃()関数に費やした時間が出力されることがあります。 攻撃がチャネルに書き込み、メインがそれを読み取り、タイマー(「攻撃」)の実行を待たずにメインが終了する場合、競合状態であることはわかっています
###私はここでは新人です:_)### リーリー誰かがこの状況に対処する方法を教えてください。両方の関数にかかった時間を出力し、チャネルを使用したいのですが
正解 が終了すると、プログラムは終了しますが、同時実行ゴルーチンは正常に終了しません (多くのプログラムでは、メイン以外のゴルーチンはまったくシャットダウンされない二次的な「デーモン」です)。そのため、既存の goroutine が遅延するという保証はありません。走ります。これがここで起こっていることです。スモークシグナルを送信するときに、攻撃
ゴルーチンがスケジュール解除されると、main は再スケジュールされる前に戻ることができるため、defer
は実行されません。
これに対処するには多くのオプションがありますが、それらはすべて基本的に同じ結果につながります。関数の実行後に
がチャネル上で送信されていることを確認してください。これは、たとえば (すべてではありません)
タイマーの前にメッセージの送信を延期します (逆の順序で実行を延期します)以上が実行中のレース条件の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。