私はウィキペディアでは、実際の本の中で並行処理でABAの問題を調査していると私はABAの問題の根本原因を理解するとして、私は前にあったようにそのアルゴリズムでは、我々は同じような状態を確認することをpostなぜ自動ガーベジコレクションはABAを除去できないのですか?
次読んだことがあるが、アルゴリズムがその状態を意味します手つかずだった。スタックと
例:
create new stack node(save to `newNode` variable)
while(true) {
oldHead = stack.get();
newNode.next = oldHead; // point_1
if(stack.compareAndSet(oldhead, newNode)) { // atomically replace head if now head same as was in start of iteration
break;
}
}
手順ABA問題へのLEED:
初期状態
a->b->c // a-head, c- tail.
-
私たちは、次のそのアルゴリズムを使用してスタックする要素を追加します
Thread_1は値を追加しようとしますスタックやOSへのはのcompareAndSet操作(point_1)
Thread_2その後、実行ポップ(Thread_1はまだ保留)
B-> C // B-ヘッド、C-尾の前にスレッドを一時停止します。
Thread_3は、(Thread_1はまだ保留)
C // C-ヘッド、C-尾をポップを実行します。
Thread_4は次に
a
(Thread_1が依然として懸濁)A-> C //ヘッド、C-尾部を押して実行します。
Thread_1 wake upとand casは、場合によっては望ましくないこともありますが、正常に実行されます。
Althoug this post私は自動ガベージコレクションがこの問題を解決する理由を理解していません。
私はCの専門家ではありませんが、Cでは2つの異なるオブジェクトに1つのメモリ範囲を割り当てることはできません。
もっと明確にすることはできますか?