ABA問題
下記の ロックフリースタックを考える:
このコードは通常は並列的なアクセスの問題を生じないが、ABA 問題を生じる。下記のようなシーケンスを考える。
スタックが初期状態で トップ → A → B → C というデータを持っているとする。
まずスレッド 1 が top から開始し、
CompareAndSwapの直前に割り込まれると、
現在、スタックの内容は top → A → C である。
ここでスレッド 1 が再開すると、CompareExchange(A, A, B)が実行される。
この処理は、top == ret (いずれも A)であるから、必ず成功し、top を next (この場合B) に割り当てる。しかし、B は解放済みであるから、何らかの問題が生じる。