ABA ist was ganz anderes. Das ABA Problem tritt nur auf, wenn man einen Pointer raus nimmt (A->B) und den Pointer danach wieder einfügt (B->A). Dieser Fall tritt bei mir nicht auf. Das Problem ist schlicht und ergreifend, dass ich nicht weiß ob Rear zu dem Zeitpunkt gültig ist oder nicht. Ich kann als (nach meinen Kenntnisstand) folgendes nicht machen:
|
C-/C++-Quelltext
|
1
|
InterlockedExchangePointer((void**)&Head, Head->next);
|
Also muss ich irgendwie sicher stellen, dass Head gültig ist. Noch Problematischer wird es, wenn ich sowas hier machen wollte:
|
C-/C++-Quelltext
|
1
2
3
|
r = Rear;
if(!r) return;
InterlockedExchangePointer((void**)&Rear->next, n, r);
|
Selbst der folgende Fall könnte eintreten, womit ich dann komplett aufgemissen bin:
|
C-/C++-Quelltext
|
1
2
3
|
if(Head)
//anderer Thread setzt Head auf NULL
InterlockedExchangePointer((void**)&Head, Head->next);//Head ist NULL=>NULL Pointer
|
Also insgesamt bin ich aufgeschmissen, da ich entweder ein cmpxchg mit einem Ungleich bräuchte, oder die Gewissheit, dass der "->" nur auseinanderfliegt, wenn ich versuche was an dem Speicherbereich zu ändern.