Go Academy · レッスン

GoのメモリモデルとHappens-Before

同期の保証とメモリ順序

レッスン 2/413 ステップ

「GoのメモリモデルとHappens-Before」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

メモリモデルとは

Go のメモリモデルは、あるゴルーチンによる変数への書き込みが、別のゴルーチンによる読み取りから見えることをいつ保証するかを定義します。こうした保証がないと、並行プログラムは古い値や一貫性のない値を観測する可能性があります。

happens-before

happens-before 関係があると、イベント A より前のすべての書き込みがイベント B で見えることが保証されます。happens-before 関係が存在しない場合、読み取りではゼロ値を含む任意の書き込みが観測される可能性があります。

保証される happens-before:ゴルーチンの開始

go ステートメントより前に発生したすべての処理は、ゴルーチンの関数が開始する前に発生したことになります。生成されたゴルーチンは、作成前に行われたすべての書き込みを確認できます。

x := 10
go func() {
    fmt.Println(x) // guaranteed to see 10
}()

保証される関係:チャネルの送受信

チャネルへの送信は、対応する受信より前に発生します。チャネルのクローズは、ゼロ値を返す受信より前に発生します。これらは主要な同期プリミティブです。

ch := make(chan int)
go func() { ch <- 42 }()   // send hb receive
v := <-ch
fmt.Println(v) // guaranteed to see 42

保証される関係:sync.Mutex

ミューテックスの n 回目の Unlock は、n+1 回目の Lock より前に発生します。これにより、アンロック後にロックを取得したゴルーチンは、アンロック前に行われたすべての書き込みを確認できます。

保証される関係:sync.Once

once.Do 関数の完了は、once.Do の呼び出しが戻る前に発生します。once.Do を呼び出すすべてのゴルーチンが初期化を確認できます。

保証される関係:チャネルのクローズ

チャネルのクローズは、クローズされたチャネルからゼロ値を返す受信より前に発生します。これにより、done チャネルから複数のゴルーチンに通知できます。

happens-before なし:保護されていない共有変数

2 つのゴルーチンが同期なしで変数にアクセスし、そのうち少なくとも 1 つが書き込みを行う場合、動作は未定義です。データ競合検出器でこの問題を検出できます。

アトミック操作

atomic パッケージは、逐次一貫性のある操作を提供します。アトミックなストアは、保存された値を観測した任意のゴルーチンにおける、同じ変数へのアトミックなロードより前に発生します。

チャネルのメモリモデル

容量 C のバッファ付きチャネルでは、k 回目の受信は、k+C 回目の送信が完了する前に発生します。これは、限られたバッファ容量がバックプレッシャーを保証することをモデル化しています。

実践的なルール

ゴルーチン間でデータを共有する場合は、チャネルを使って所有権を移譲するか、ミューテックスまたはアトミック操作を使って読み取りと書き込みを保護します。同期なしに、処理の順序を直感だけで判断しないでください。

クイックチェック

次のうち、ゴルーチン間に happens-before 関係を作るものはどれですか。

まとめ:Go のメモリモデル

要点:

  • happens-before は、ゴルーチン間で書き込みがいつ見えるかを定義します
  • チャネル、Mutex、Once、ゴルーチンの開始によって HB エッジが作られます
  • 共有された可変状態への同期なしのアクセスは未定義です
  • 問題の検出にはデータ競合検出器を使用します
無料で開始

AI チューターと学ぶ Go — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「GoのメモリモデルとHappens-Before」レッスンは無料ですか?

はい。「GoのメモリモデルとHappens-Before」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「GoのメモリモデルとHappens-Before」で何を学びますか?

同期の保証とメモリ順序 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「GoのメモリモデルとHappens-Before」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スタックとヒープ、エスケープ解析
  2. GoのメモリモデルとHappens-Before
  3. ガベージコレクターの内部
  4. メモリ割り当ての削減:sync.PoolとArena
← Go Academyに戻る