Bitte beachten Sie, dass ich das ABA-Problem bereits kenne und verstehe. Diese Frage bezieht sich auf das Verhalten des .NET-Speichermodells in Bezug auf ABA.
In seiner Diskussion des Lock-Free LIFO-Stacks (CLR Inside Out-Spalte) ab Mai 2007 MSDN Magazine), sagt Joe Duffy:
"Wir nehmen für jeden Push eine Objektzuordnung an und ersparen uns so die Sorge um so genannte ABA-Probleme."
Er fährt dann fort, das ABA-Problem sehr kurz zu beschreiben und erwähnt, dass dies in nativem C / C ++ vorkommen kann, da der Speicherzuordner eine Adresse wiederverwenden kann, sobald sie freigegeben ist.
Alles gut und gut. Aber was macht .NET-Programme gegen das ABA-Problem immun? Bedeutet er, dass, weil Knoten nicht sofort wiederverwendet werden können (d. H., Es gibt eine gewisse Verzögerung zwischen dem Verlassen eines Bereichs und dem Sammeln des Knotens), besteht keine Möglichkeit, dass das ABA-Problem auftritt? Wenn ja, ist das eine sichere Behauptung zu machen?
Ich werde als Erster zugeben, dass ich nicht alle Feinheiten des .NET-Speicherzuordners oder Garbage Collectors kenne, aber mein begrenztes Verständnis führt mich zu der Annahme, dass eine Referenz sein kann wiederverwendet. Und wenn es eine Möglichkeit gibt, dass eine Referenz wiederverwendet werden kann, macht das dann das ABA-Problem nicht möglich, wenn es tatsächlich sehr unwahrscheinlich ist?
Wenn ein Thread 1 eine Objektreferenz an der Speicheradresse X hat, kann definitionsgemäß nichts, was Thread 2 tut, bewirken, dass ein anderes Objekt dieselbe Adresse verwendet. Das Objekt ist noch am Leben und seine Adresse wird nicht wiederverwendet, bis keine Referenzen mehr vorhanden sind. Dies garantiert, dass - wenn der verriegelte Austauschvorgang den erwarteten Wert zurückgibt - das ABA-Problem nicht aufgetreten ist.
Tags und Links .net c# concurrency