Im Papier mit dem gleichen Titel wie die von dieser Frage, beschreiben die Autoren , wie ein bauen , nicht blockierend linearisierbar Mehrwort CAS nur mit einem einzigen Wort CAS Betrieb. Sie führen zunächst die Double-Compare-Single-Swap-Operation - RDCSS - wie folgt ein:
word_t RDCSS(RDCSSDescriptor_t *d) {
do {
r = CAS1(d->a2, d->o2, d);
if (IsDescriptor(r)) Complete(r);
} while (IsDescriptor(r));
if (r == d->o2) Complete(d); // !!
return r;
}
void Complete(RDCSSDescriptor_t *d) {
v = *(d->a1);
if (v == d->o1) CAS1(d->a2, d, d->n2);
else CAS1(d->a2, d, d->o2);
}
Dabei RDCSSDescriptor_t
ist das eine Struktur mit folgenden Feldern:
a1
- Adresse der ersten Bedingungo1
- Wert erwartet an der ersten Adressea2
- Adresse der zweiten Bedingungo2
- Wert erwartet an der zweiten Adressen2
- der neue Wert, der an die zweite Adresse geschrieben werden soll
Dieser Deskriptor wird einmal in einem Thread erstellt und initialisiert, der die RDCSS-Operation initiiert. Kein anderer Thread hat einen Verweis darauf, bis das erste CAS1 in der Funktion RDCSS
erfolgreich ist, wodurch der Deskriptor erreichbar (oder in der Terminologie des Dokuments aktiv ) wird.
Die Idee hinter dem Algorithmus ist die folgende: Ersetzen Sie den zweiten Speicherort durch einen Deskriptor, der angibt, was Sie tun möchten. Wenn der Deskriptor vorhanden ist, überprüfen Sie den ersten Speicherort, um festzustellen, ob sich sein Wert geändert hat. Ist dies nicht der Fall, ersetzen Sie den Deskriptor am zweiten Speicherort durch den neuen Wert. Andernfalls setzen Sie den zweiten Speicherort auf den alten Wert zurück.
Die Autoren erklären nicht, warum die Zeile mit dem !!
Kommentar innerhalb des Papiers notwendig ist. Es scheint mir, dass die CAS1
Anweisungen in der Complete
Funktion nach dieser Überprüfung immer fehlschlagen, vorausgesetzt, es erfolgt keine gleichzeitige Änderung. Und wenn es eine gleichzeitige Änderung zwischen der Prüfung und dem CAS-Eingang gab Complete
, sollte der Thread, der die Prüfung durchführt, immer noch mit seinem CAS-Eingang fehlschlagen Complete
, da die gleichzeitige Änderung nicht denselben Deskriptor verwenden sollte d
.
Meine Frage ist: Kann die Prüfung in der Funktion RDCSSS
, if (r == d->o2)...
weggelassen wird, mit RDCSS noch die Semantik einer Doppel vergleichen, einzelnen Swap - Anweisung beibehalten , die ist linearisierbar und Lock-frei ? (Zeile mit !!
Kommentar)
Wenn nicht, können Sie das Szenario beschreiben, in dem diese Zeile tatsächlich erforderlich ist, um die Richtigkeit sicherzustellen?
Vielen Dank.