2010-12-09 7 views
2

Ich lese einen Artikel, der das ABA-Problem beschreibt, aber es gibt etwas, das ich nicht verstehen kann. Ich habe Quellcode, der nicht funktioniert und es ist ähnlich dem Beispiel in Artikel, aber ich verstehe das Problem nicht. Hier ist der ArtikelBrauchen Sie Hilfe beim Verständnis des "ABA" -Problems

http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6

Dort heißt es: Während der tatsächliche Wert von head_ gleich ist (a) die next_ Zeiger ist nicht

Aber wie kann das sein? Wenn zwei Struktur

struct node { 
    node *next; 
    data_type data; 
}; 

„head_“ und „Strom“ auf den gleichen Bereich in Speicherobjekten, wie kann Kopf _-> weiter und strom-> nächsten Punkt anders?

Es sagt auch: Die letzte Operation, die vergleichen und tauschen von foo SUCCEEDS wenn es nicht sollte.

Was sollte es dann tun? Laden Sie die gleiche Adresse und versuchen Sie es erneut? Was ist der Unterschied?

Zeit in meinem Code habe ich ähnliche Situation, wo ich compareAndSwap auf dem Objekt zu tun, die von einem anderen Thread auf das Objekt mit ähnlicher Adresse geändert werden könnten

deleted.compare_exchange_strong(head, 0); 

aber, wenn das Objekt geändert wird gut initialisiert und es ist Nächster Zeiger enthält Zeiger auf initialisiertes Objekt, was ist das Problem?

Vielen Dank im Voraus.

+0

Veröffentlichen Sie Ihren Code, was passiert, wenn Sie es ausführen und was Sie erwartet haben, wenn Sie es ausführen. Dieser Blogeintrag ist lang und wortreich.:) Wenn Sie wirklich möchten, Parallelität Primitiven zu lernen, empfehle ich Curt Schimmel's Unix-Systeme für moderne Architekturen: Symmetrische Multiprocessing und Caching für Kernel-Programmierer (http://www.powells.com/biblio?isbn=9780201633382) – sarnold

+0

Wenn Ich posten und erklären meinen Code es wird absolut die gleiche Erklärung wie im Blog und vielleicht noch schlimmer, wegen meiner nicht gut genug Englisch :) Meine Quelle ist fast gleich und es funktioniert nicht, also möchte ich überprüfen, ob es enthält wirklich ABA-Problem oder nicht. Danke für das Buch :) Ich war auf der Suche nach etwas Interessantes zu lesen. Aber – ledokol

+0

es scheint nicht das ABA Problem für mich zu sein. Es scheint ein Problem zu geben, Multithreading, aber es ist nicht die Art, wie ich ABA bis jetzt verstanden habe. –

Antwort

6

„head_“ und „Strom“ auf den gleichen Bereich im Speicher kann wie Kopf _-> weiter und strom-> nächsten Punkt anders?

Sie nicht; aber der Code benötigt, dass sowohl head als auch head->next stabil sind, während die pop-Methode ausgeführt wird - aber das CAS stellt nur dies für head sicher. Es wird stillschweigend davon ausgegangen, dass head->next nicht geändert wird, ohne head zu ändern, was falsch ist. Also liest es etwas wie current->next und etwas später ändert es sich.

Es sagt auch: Die letzte Operation, die vergleichen und tauschen von foo SUCCEEDS wenn es nicht sollte.

Was sollte es dann tun? Laden Sie die gleiche Adresse und versuchen Sie es erneut? Was ist der Unterschied?

Ja. Die Methode muss warten (oder weiter versuchen), bis niemand die Struktur unter ihren Händen durcheinander bringt.

aber wenn das Objekt gut initialisiert ist und der nächste Zeiger den Zeiger auf das initialisierte Objekt enthält, was ist das Problem?

Könnte alles sein. Verstöße gegen Invarianten der Klassen, doppelte Freigaben/Speicherverluste, Datenverluste usw.

+0

Es ist mir immer noch nicht klar :(Wenn beide auf die gleiche Struktur zeigen und diese Struktur geändert wird, ändert sich beim Schleifen mit CAS nichts. Es wird head = current, während head und current gleich sind, also Was ist der Grund? Wenn sie die gleiche Adresse haben - sie zeigen auf das gleiche Objekt, bedeutet es, dass -> nächste ist das gleiche und es kann nicht anders sein. Also ist die stille Annahme richtig. Wo ist der Fehler in meiner Logik? – ledokol

Verwandte Themen