Goroutine の印刷とスレッド セーフ
マルチスレッド プログラムでは、同時操作のスレッド セーフを確保することが重要です。複数のゴルーチンが標準出力 (stdout) に同時に出力しようとすると、一般的な問題が 1 つ発生します。
問題
明示的な同期がないと、fmt が呼び出される可能性があります。異なるゴルーチンからの Println がインターリーブする可能性があり、その結果、出力が破損したり、行が表示されなくなったりすることがあります。 order.
答え
一部の人が想定していることに反して、複数のゴルーチンが stdout に同時に出力することは本質的に安全ではありません。 fmt パッケージはデータ破損を最小限に抑えるよう努めますが、それを保証するものではありません。
Go ドキュメントでは、明示的に指定されていない限り、またはコンテキストから明らかでない限り、stdout を含むリソースへの同時アクセスは安全ではないことを強く強調しています。
安全な解決策
同時印刷の安全な解決策は、ログパッケージ。次の手順は、同期ログ システムを確立する簡単な方法を示しています。
log.Print または log.Println を使用します複数のゴルーチンからの関数:
logger := log.New(os.Stderr, "prefix: ", log.Ldate | log.Ltime | log.Lshortfile) logger.Print("Message from goroutine 1") logger.Println("Message from goroutine 2")
結論
明示的な同期は必要ありませんが、同期の潜在的な危険性を認識することが重要です。標準出力への同時印刷。信頼性と一貫性のある出力を実現するには、ログ パッケージを使用してログ システムを実装し、データの破損や行のインターリーブに関する懸念を排除することをお勧めします。
以上がGo で複数のゴルーチンが標準出力に出力するときにスレッドの安全性を確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。