Ich suche nach einem Äquivalent von LWARX und STWCX (wie auf den PowerPC-Prozessoren gefunden) oder eine Möglichkeit, ähnliche Funktionalität auf der x86-Plattform zu implementieren. Auch, wo wäre der beste Ort, um über solche Dinge zu erfahren (d. H. Gute Artikel/Websites/Foren für Lock/wartefreies Programmieren).x86 Äquivalent für LWARX und STWCX
bearbeiten
ich glaube, ich könnte mehr Details geben müssen, wie es, dass ich für einen CAS bin nur (Vergleichs- und Auslagerungs) Betrieb suchen angenommen wird. Was ich versuche, ist ein Lock-Free-Referenzzählsystem mit intelligenten Zeigern zu implementieren, auf die mehrere Threads zugreifen und diese ändern können. Ich brauche im Grunde eine Möglichkeit, die folgende Funktion auf einem x86-Prozessor zu implementieren.
int* IncrementAndRetrieve(int **ptr) { int val; int *pval; do { // fetch the pointer to the value pval = *ptr; // if its NULL, then just return NULL, the smart pointer // will then become NULL as well if(pval == NULL) return NULL; // Grab the reference count val = lwarx(pval); // make sure the pointer we grabbed the value from // is still the same one referred to by 'ptr' if(pval != *ptr) continue; // Increment the reference count via 'stwcx' if any other threads // have done anything that could potentially break then it should // fail and try again } while(!stwcx(pval, val + 1)); return pval; }
ich wirklich brauchen etwas, das imitiert LWARX und STWCX ziemlich genau diese abziehen (ich nicht einen Weg finden, können diese Funktionen mit dem CompareExchange, Swap zu tun oder füge ich für die bisher gefunden habe x86).
Dank
DCAS sieht fast richtig aus, außer ich muss nur 1 Wort ändern, wenn sich ein Zeiger auf dieses Wort nicht ändert (das ist ein wenig verwirrend, hoffentlich hilft die Aktualisierung der Frage, dies zu verdeutlichen). –
Ich habe es geschafft, einen Workaround mit DCAS zu finden, es ist nicht idiotensicher, da es eine eindeutige ID (4 Byte) verwendet, aber die Wahrscheinlichkeit, dass es bricht, ist gering, da sowohl die 4-Byte-UID als auch der 4-Byte-Zähler daneben liegen müssen genau repliziert. Dies ist nur ein Problem, wenn etwas das Objekt löscht, den Speicher an etwas anderes neu zuweist und dann diese 8 Bytes dupliziert, während ein anderer Thread versucht, einen Zeiger zu kopieren, was eine relativ kurze Operation ist (dh die Länge ist nur lang) genug, wenn der Thread unterbrochen wird) –
Ich weiß nicht, über die PPC im Besonderen, aber auf den meisten Maschinen, Load-Exclusive/Store-Conditional Anweisungen nicht wirklich mit dem ABA-Problem helfen, weil Speichervorgänge zwischen einem Load-Exclusive durchgeführt und eine Speicherbedingung kann dazu führen, dass die speicherbedingte Operation spontan fehlschlägt. Wenn man den geschützten Ort erneut liest und sieht, dass er sich geändert hat, kann man erkennen, dass etwas anderes ihn mit einem neuen Wert geschrieben hat, aber wenn er den gleichen Wert wie beim vorherigen Lesen hat, wird es keinen Weg geben, einen spontanen Fehler zu unterscheiden ein ABA schreiben. – supercat