TL;DR
CPU がメインメモリにアクセスする順序を制御する仕組み。マルチスレッド環境で、データの可視性と操作の順序を保証する。
なぜ必要か
プロセッサとコンパイラは、できるだけ速く実行するためにさまざまな最適化を行う。この最適化が他のスレッドとのやり取りを考えずに行われると、予期しない動作を引き起こす。これを防ぐためにメモリバリアを使う。
例
Rust は std::sync::atomic::Ordering として 5 種類のメモリオーダリングを提供しており、それぞれ保証が異なる。Rust のメモリオーダリングは C++20 のものと同じである。
Relaxed: 順序の制約はなく、操作がアトミックであることだけを保証する。最も弱く、自由に並び替えられるRelease: ストアで使うと、それより前の操作はすべて、この値をAcquire以上で読むロードより前に順序づけられるAcquire: ロードで使うと、読んだ値がRelease以上のストアで書かれていれば、それより後の操作はすべてそのストアの後に順序づけられるAcqRel: ロードにはAcquire、ストアにはReleaseを使うSeqCst:Acquire、Release、AcqRelの保証に加え、逐次一貫な操作をすべてのスレッドが同じ順序で観測することを保証する