O código a seguir vem do GCC Wiki .
// -Thread 1- y.store (20, memory_order_relaxed) x.store (10, memory_order_relaxed) // -Thread 2- if (x.load (memory_order_relaxed) == 10) { assert (y.load(memory_order_relaxed) == 20) /* assert A */ y.store (10, memory_order_relaxed) } // -Thread 3- if (y.load (memory_order_relaxed) == 10) assert (x.load(memory_order_relaxed) == 10) /* assert B */
Como os threads não precisam ser sincronizados no sistema, qualquer uma das asserções neste exemplo pode realmente FALHAR .
Eu consigo entender por que assert A pode falhar. Mas como assert B também pode falhar?
Isso y.load() == 10
implica o fim do tópico 2, então x.load() == 10
?