提供されたコードには、concurrentStruct() と concurrentStructWithMuLock という 2 つの関数が導入されています。 ()。どちらの関数も構造体の読み取りと書き込みを同時に実行しますが、前者はロックなしで実行するため、競合警告が生成されます。逆に、後者は読み取り/書き込みミューテックスを使用してアクセスを同期するため、競合警告は発生しません。
エラー メッセージが示すように、データ競合は次の場合に発生します。
concurrentStruct() では、Metadata struct のキー フィールドが同期せずに複数の goroutines によってアクセスおよび変更されるため、この状況が発生します。
while concurrentStruct()はロックを使用しないため、無期限に実行される匿名ゴルーチンを使用すると、競合状態が発生する可能性があります。これらのゴルーチンは、他のゴルーチンのアクションを考慮せずに、キー フィールドの読み取り、変更、書き込みを継続的に行います。
concurrentStruct() とは対照的に、concurrentStructWithMuLock() は読み取りを使用します。 -write mutex は、キー フィールドへのアクセスを同期します。これにより相互排他が確保され、複数のゴルーチンが同時にフィールドを変更することが防止されます。その結果、競合状態は発生せず、関数は警告なしで実行されます。
concurrentMap() 関数は、Go マップに関係する別のタイプの競合状態を示しています。 。 Go ではマップはスレッドセーフですが、適切な同期を行わずに読み取りと書き込みの両方でマップに同時にアクセスすると、致命的なエラーが発生する可能性があります。 Go のランタイムには軽量のデータ競合検出機能が含まれており、未定義の動作に対する安全策として、マップへの非同期アクセスを検出するとプログラムをクラッシュさせます。
以上がGo 構造体での同時読み取りおよび書き込み操作を安全に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。