【シーエーエス】
CAS(コンペア・アンド・スワップ) とは?
最終更新:
💡 期待値なら更新する、不可分な比較と交換
メモリの値が期待値と一致したときだけ更新する比較・交換を、他のスレッドから不可分に見える操作として行う仕組み。原子性を保証するが、単一CPU命令や割り込み禁止を意味するわけではない。
📌 このページのポイント
CASって何? ロックとは違うものなの?
普通に「読んで、比べて、書く」じゃだめなの?
それだと、比較してから書くまでの間に別のスレッドが値を書き換えるかもしれないよね。CASでは比較と条件付き更新が一体なので、その間に別の更新が入り込む隙間をなくせるんだ。
比べて違っていたら、どうなるの?
落とし穴はないの?
値がA→B→Aと戻ると、値だけの比較では途中の変化に気づけない。これがABA問題だよ。対策の一つは値と更新番号を一緒に比較・更新すること。全更新で番号を変える設計や番号の循環への配慮も必要で、番号を添えるだけで何でも解決するわけではないんだ。
プログラミング言語ではどう書くの?
もっと詳しく知りたい人へ
C++のatomicなら、必ずロックフリー?
必ずではないよ。型や実装によって異なり、is_lock_freeで確認できる。CASを使うだけでアルゴリズム全体の進行保証も決まらないんだ。操作の原子性とメモリの順序保証も別なので、共有データの受け渡しでは適切なメモリオーダーを選ぼう。
まとめ:ざっくりこれだけ覚えればOK!
「CAS」って出てきたら「期待した値なら更新する、不可分な比較・更新操作」と思えばだいたいOK!
📖 おまけ:英語の意味
「Compare-And-Swap」 = 比較して交換する(操作)
💬 Compare(比較)とSwap(交換)を1つの不可分な操作でやってしまうから、この名前だよ