【 在 libgcc 的大作中提到: 】
:
https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync: -Thread 1-
: y.store (20, memory_order_relaxed)
: ...................
: 是说在thread2里的y.store(10)也有可能发生在thread1的x.store(10)之前是么
这倒不会。但thread3:
if (y.load (memory_order_relaxed) == 10)
assert (x.load(memory_order_relaxed) == 10) /* assert B */
有可能生成类似这样的代码:
load reg1, x
load reg2, y
if reg2==10:
assert(reg1==10)
不过你说那种情况也不是不可能
-Thread 2-
if (x.load (memory_order_relaxed) == 10)
{
assert (y.load(memory_order_relaxed) == 20) /* assert A */
y.store (10, memory_order_relaxed)
}
也有可能被生成为:
load reg1, y
load reg2, x
store #10, y
if reg2==10:
assert(reg1==20)
else: // very unlikely
store reg1, y
--
修改:ilovecpp FROM 114.86.90.*
FROM 114.86.90.*