Supposons que je l'extrait de code suivant:modification des valeurs atomiques afin détendue
std::atomic<int> a(0);
void thread1()
{
int x = a.fetch_add(1, std::memory_order_relaxed);
std::cout << x << std::endl;
}
void thread2()
{
int x = a.fetch_add(1, std::memory_order_relaxed);
std::cout << x << std::endl;
}
int main()
{
std::thread t1(thread1);
std::thread t2(thread2);
t1.join();
t2.join();
}
La question est: puis-je obtenir 0 0
en conséquence?
Ici, les deux threads lisent et modifient a
dans un ordre mémoire détendu, il semble donc que tous les deux peuvent voir la valeur zéro de a
. Mais en pratique, je ne vois que 0 1
ou 1 0
.
La commande relaxée concerne le (manque de) synchronisation. Votre code n'a aucun problème de synchronisation. Les opérations Atomic RMW doivent toujours être correctes même lorsqu'elles ne sont pas commandées. –