ホームページ > バックエンド開発 > Golang > 実行中のレース条件

実行中のレース条件

王林
リリース: 2024-02-08 21:00:04
転載
1237 人が閲覧しました

実行中のレース条件

質問内容

コードを実行すると、攻撃()関数に費やした時間が出力されることがあります。 攻撃がチャネルに書き込み、メインがそれを読み取り、タイマー(「攻撃」)の実行を待たずにメインが終了する場合、競合状態であることはわかっています

###私はここでは新人です:_)### リーリー

誰かがこの状況に対処する方法を教えてください。両方の関数にかかった時間を出力し、チャネルを使用したいのですが

正解

when
main

が終了すると、プログラムは終了しますが、同時実行ゴルーチンは正常に終了しません (多くのプログラムでは、メイン以外のゴルーチンはまったくシャットダウンされない二次的な「デーモン」です)。そのため、既存の goroutine が遅延するという保証はありません。走ります。これがここで起こっていることです。スモークシグナルを送信するときに、攻撃ゴルーチンがスケジュール解除されると、main は再スケジュールされる前に戻ることができるため、defer は実行されません。 これに対処するには多くのオプションがありますが、それらはすべて基本的に同じ結果につながります。関数の実行後に

がチャネル上で送信されていることを確認してください。これは、たとえば (すべてではありません)

タイマーの前にメッセージの送信を延期します (逆の順序で実行を延期します)
    サブ関数の
  • defer()、外部関数の signal
  • 遅延を使用しないでください。シグナルを送信する前に終了メッセージを実行するだけです
  • メッセージと出力を別々に送信するのではなく、関数のランタイムをチャネル経由で送信し、呼び出し元にフォーマットとレポートを行わせます。

以上が実行中のレース条件の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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