【メモリバリア】
メモリバリア とは?
最終更新:
💡 メモリの読み書きに、守るべき順序を作る境界
メモリの読み書きについて、特定の前後関係を守るための仕組み。CPUやコンパイラによる順序の入れ替えを制約する。メモリフェンスとも呼ばれる。
📌 このページのポイント
メモリバリアって何? 何を邪魔する壁なの?
順序が入れ替わると何が困るの?
バリアを置けば、処理が全部終わるの?
releaseとacquireはどう組み合わせるの?
C++なら、Aがdataを書いた後、atomicなflagに1をreleaseで保存する。Bが同じflagをacquireで読み、その保存した1を受け取れば、先行するdataの書き込みを観測できるよ。dataをその後に書き換えないなど、別のデータ競合がないことも前提なんだ。
CPUごとに同じ命令を使うの?
もっと詳しく知りたい人へ
バリアを1つ置けば安全になりますか?
なりません。図はC++のatomic操作でdataを一度だけ公開する例です。flagは初期値0で、読み取り側がrelease保存した1をacquireで受け取り、その後dataに別の書き込みがないことが前提です。relaxedはflag自身の原子性を保ちますが、別のdataの公開を同期しません。
まとめ:ざっくりこれだけ覚えればOK!
「メモリバリア」って出てきたら「メモリの読み書きに必要な順序を守る境界」と思えばだいたいOK!
📖 おまけ:英語の意味
「Memory Barrier」 = メモリの障壁。Memory Fenceとも呼ばれる
💬 Barrierは障壁、Fenceは柵という意味だよ。境界をまたぐ読み書きの順序を制約するイメージで捉えよう。