我正在研究这个网站:https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync,这对了解有关原子类的主题非常有帮助.
但这个关于放松模式的例子很难理解:
/*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 */
Run Code Online (Sandbox Code Playgroud)
对我来说断言B应该永远不会失败,因为x必须是10且y = 10,因为线程2已经以此为条件.
但网站上说这个例子中的断言实际上可能是失败的.