Entschuldigt, wenn dies wurde bereits beantwortet, oder wenn ich etwas fehlt offensichtlich.Sind verschachtelte atomare Operationen garantiert atomar?
Ich versuche, wie tief die Garantien der Unteilbarkeit für std::atomic
gehen zu verstehen. wenn wir zum Beispiel
std::atomic<int> a(0);
a.store(1);
die Speicheroperation Atom wird. Doch was passiert, wenn wir atomare Operationen verschachtelt sind, wie folgt aus:
std::atomic<int> a(0);
std::atomic<int> b(1);
a.store(++b);
Mein Verständnis ist, dass ++b
atomar ist, und so ist store()
. Habe ich Recht davon ausgehen, dass dies gewährleistet ist 2
atomar speichern in a
?
Noch wichtiger ist, wenn a
und b
zwischen Threads gemeinsam benutzt werden T1
und T2
, ist garantiert, dass a.store(++b);
von beiden Threads durchgeführt wird der inkrementierte Wert von b
speichern (wie durch die jeweiligen Fäden aus gesehen) in a
atomar in jedem Faden? Mit anderen Worten kann, Gewinde T2
„butt in“ und erhöhen b
nochmals nachT1
bereits einmal erhöht hat aber vor wird das Ergebnis in a
von T1
gespeichert?
Unter der Annahme, 'b' zwischen Gewinde freigegeben ist, Inkrementieren von 'b' passieren kann, bevor 'a.store (++ b);'. daher ist der Wert von "a" keine Garantie für "2". – Jarod42