Meine erste Frage ist: Gibt es eine Möglichkeit, auf die Mitglieder der Struktur in einem atomic<struct>
Objekt zuzugreifen? Zum Beispiel habe ich den Compiler-Fehler:Missverständnis von Atomstrukturen und Zeigern
struct std::atomic<node>’ has no member named ‘data’ a.data = 0;
in diesem Segment
struct node{
int data;
node* next;
};
int main(){
atomic<node> a;
a.data = 0;
}
Ich kann einen temporären Knoten um ihn herum arbeiten wie so durch die Schaffung von:
atomic<node> a;
node temp;
temp.data = 0;
a.store(temp);
aber dieses doesn Es scheint sehr elegant zu sein.
Die zweite Frage ist, was ist, wenn ich einen Zeiger auf ein atomares Objekt habe? Gibt es trotzdem einen direkten Zugriff auf die Mitglieder des Knotens? Offensichtlich kompiliert das Folgende nicht, wie würde ich dies ändern, um 0 im Wert des Knotens bei b zu speichern?
atomic<node> b = new node;
b->data = 0;
eine Lösung Dies habe ich gefunden, aber auch hier gibt es eine elegantere Möglichkeit, dies zu tun ??
atomic<node> *b;
node temp;
temp.data = 0;
b->store(&temp);
Und schließlich, was ist der Unterschied zwischen atomic<node*>
und atomic<node>*
Nein, es gibt nur eine begrenzte Anzahl von atomaren Operationen (laden, speichern, austauschen, ...) –
'atomare' erzwingt die atomare Aktualisierung des Zeigers (nicht das, worauf der Zeiger zeigt, nur der Zeiger). 'Atom *' ist ein Zeiger auf einen '' atomic , deren Absicht ist, atomare Aktualisierung des 'node' Objekts zu erzwingen. –
Barry
Wenn Sie eine Struktur wollen, in der Sie * beide * Elemente zusammen aktualisieren oder eine davon atomisch ändern können (ohne compare_exchange_weak für die gesamte Struktur), können Sie [eine Vereinigung einer atomaren Struktur und einer Struktur mit zwei atomaren Strukturen verwenden Mitglieder] (http://stackoverflow.com/questions/38984153/implement-aba-counter-with-c11-cas/38991835#38991835). (Wenn Sie einen C++ - Compiler verwenden, der garantiert, dass Sie ein Union-Mitglied schreiben und dann ein anderes lesen, ist das in Ordnung, wie in C99). Dies funktioniert tatsächlich (effizient) für Strukturen bis zu der maximalen Größe, die die Hardware cmpxchg kann, d. H. 16B auf x86-64. –