atomic Swap mit CAS (unter Verwendung von GCC Sync Builtins)
Kann die Compare-and-Swap-Funktion verwendet werden, um Variablen atomar auszutauschen? Ich verwende C / C ++ über gcc unter x86_64 RedHat Linux, insbesondere die integrierten __sync-Funktionen. Beispiel
int x = 0, y = 1;
y = __sync_val_compare_and_swap(&x, x, y);
Ich denke, das läuft darauf hinaus, ob x zwischen & x und x wechseln kann. Wenn beispielsweise & x eine Operation darstellt, kann x in den Argumenten möglicherweise zwischen & x und x wechseln. Ich möchte annehmen, dass der obige implizite Vergleich immer wahr sein wird; meine frage ist ob ich kann. Natürlich gibt es die Bool-Version von CAS, aber dann kann ich das alte x nicht dazu bringen, in y zu schreiben.
Ein nützlicheres Beispiel könnte das Einfügen oder Entfernen aus dem Kopf einer verknüpften Liste sein (gcc behauptet, Zeigertypen zu unterstützen, nehmen wir also an, dass dies das ist, was elem und head sind):
elem->next = __sync_val_compare_and_swap(&head, head, elem); //always inserts?
elem = __sync_val_compare_and_swap(&head, head, elem->next); //always removes?
Referenz:http: //gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.htm