競合検出器と安全なパターン
-raceフラグを使い、データ競合を避けます。
「競合検出器と安全なパターン」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
データ競合とは
データ競合は、2つのゴルーチンが同じメモリ位置に同時にアクセスし、そのうち少なくとも一方が書き込みであり、同期が行われていない場合に発生します。データ競合は未定義動作を引き起こします。
競合検出器を有効にする
-raceを付けて実行またはテストすると、Go組み込みの競合検出器が有効になります。
go run -race main.go
go test -race ./...競合検出器の出力
競合が検出されると、検出器は競合するアクセスを示すゴルーチンのスタックトレースを出力し、プログラムを終了します。出力から、関係する正確な行を確認できます。
パフォーマンスへの影響
競合検出器を使用すると、メモリ使用量は約5~10倍、実行速度は約2~20倍低下します。本番ビルドではなく、CIとテスト環境で実行してください。
よくある安全なパターン: atomic
sync/atomicは、単純な整数カウンターやポインターに対してロックフリー操作を提供し、完全なmutexによるオーバーヘッドを避けます。
var counter int64
atomic.AddInt64(&counter, 1)
fmt.Println(atomic.LoadInt64(&counter))よくある安全なパターン: チャネルによる所有権
一度に1つのゴルーチンだけが値を所有し、所有権はチャネルを通じて移転します。共有メモリがなければ、競合も発生しません。
ch := make(chan []byte)
go func() { ch <- makeData() }()
data := <-ch // sole owner nowよくある安全なパターン: 不変データ
ゴルーチン間で共有する読み取り専用データは安全です。書き込みはゴルーチンの開始前に行うか、同期してください。Stringと[N]Tの値は、作成後であれば安全に共有できます。
テストで競合を検出する
競合検出器はgo test -raceとともに使用できます。並行処理の経路を実行するテストを作成してください。検出器は、問題のない逐次テストでは見逃される競合を検出します。
sync.atomicとmutexの比較
単一変数の更新(カウンターやフラグ)にはatomicを使用します。複数の変数にまたがる不変条件を保護するにはmutexを使用します。注意深く分析せずに両者を混在させると、エラーが発生しやすくなります。
happens-before
Goは、チャネル操作、mutexのLock/Unlock、sync.Once.Doについてhappens-before関係を保証します。同じゴルーチン内の操作は順番どおりに実行されます。
偽共有
隣接するメモリ(同じキャッシュラインにある別々のフィールド)を2つのゴルーチンが更新すると、キャッシュスラッシングが発生する可能性があります。特定の構造体で競合が発生していることがプロファイリングで判明した場合は、[64]byteで構造体をパディングします。
確認問題
Goの競合検出器を有効にするフラグはどれですか。
まとめ: 競合検出器と安全なパターン
要点:
- CIでは必ずgo test -raceを実行します
- 安全なパターンは、チャネル、mutex、atomic、不変データです
- 競合検出器の出力には、正確なゴルーチンのスタックが表示されます
- 本番ビルドでは-raceを使用しないでください
AI チューターと学ぶ Go — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「競合検出器と安全なパターン」レッスンは無料ですか?
はい。「競合検出器と安全なパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「競合検出器と安全なパターン」で何を学びますか?
-raceフラグを使い、データ競合を避けます。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「競合検出器と安全なパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。