Ich habe ABA Problem in Concurrency in der Praxis Buch untersucht, in wikipedia und ich habe folgende postWarum automatische Garbage Collection ABA-Problem beseitigt?
lesen Wie ich die Ursache für ABA Problem, dass in algoritm wir diesen Zustand gleiche überprüfen verstehen wie vorher war, aber Algorithmus impliziert, dass staatliche war unberührt.
Beispiel mit Stack:
Element hinzuzufügen, zu stapeln, verwenden wir folgende Algoritm:
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;
}
}
Schritte, die LEED zum ABA Problem:
Ausgangszustand
a->b->c // a-head, c- tail.
Thread_1 versucht, den Werthinzuzufügenauf den Stapel und OS suspendieren den Faden vor compareAndSet Betrieb (Point_1)
Thread_2 dann auszuführen pop (Thread_1 noch suspendierte)
b-> c // B-Kopf, c- tail.
Thread_3 dann pop auszuführen (Thread_1 noch suspendierte)
c // C-Kopf, c- tail.
Thread_4 führt dann schieben
a
(Thread_1 noch suspendierte)a-> c // a-Kopf, c- tail.
Thread_1 wacht auf und der Cas-Vorgang wird erfolgreich ausgeführt, obwohl dies in einigen Fällen unerwünscht sein kann.
Althoug this post akzeptiert Ich verstehe nicht, warum automatische Garbage Collection, das Problem beseitigt.
Obwohl ich kein Experte in C bin, verstehe ich, dass in C Sie nicht einen Speicherbereich für zwei verschiedene Objekte zuweisen können.
Können Sie es klarer klären?