给定下面的C代码:
static atomic_int a_i;
static void f()
{
for (int i = 0; i < 100; ++i)
atomic_fetch_add_explicit(&a_i, 1, memory_order_relaxed);
}
和两个线程并发调用f()
.
是否a_i
可能最终导致硬件平台具有宽松的缓存一致性协议(与x86不同)的非200
?换句话说,该操作是原子性的,但不能保证一个线程的写操作对另一个线程立即公开可见。
结果值保证为200。
内存顺序参数只决定哪些其他修改对其他线程可见。memory_order_relaxed
表示不作任何保证。但是变量本身仍然是自动更新的。