Excuses si cela a déjà été répondu, ou si quelque chose me manque.Les opérations atomiques imbriquées sont-elles garanties atomiques?
J'essaie de comprendre à quel point les garanties de l'atomicité vont de std::atomic
. Par exemple, si nous avons
std::atomic<int> a(0);
a.store(1);
l'opération de stockage est atomique. Cependant, ce qui se passe si nous avons imbriqué des opérations atomiques, comme ceci:
std::atomic<int> a(0);
std::atomic<int> b(1);
a.store(++b);
Ma compréhension est que ++b
est atomique, et est donc store()
. Ai-je raison de supposer que cela est garanti de stocker 2
atomiquement dans a
?
Plus important encore, si a
et b
sont partagés entre les fils T1
et T2
, est-il garanti que a.store(++b);
effectué par les deux fils va stocker la valeur incrémentée de b
(comme on le voit par les fils respectifs) dans a
atomiquement dans chaque fil? En d'autres termes, peut enfiler T2
« bout à bout dans » et incrémenter b
une fois de plus aprèsT1
a déjà incrémentée une fois, mais avant le résultat est stocké dans a
par T1
?
En supposant 'B' est partagé entre du fil, incrémentation de 'B' peut se produire avant 'a.store (++ b);'. donc la valeur de 'a' n'est pas garantie d'être' 2'. – Jarod42