当前的C++0x 草案在第 29.3.9 节和第 29.3.10 节第 1111-1112 页上说明了以下示例:
// Thread 1
r1 = y.load(memory_order_relaxed);
x.store(1, memory_order_relaxed);
// Thread 2
r2 = x.load(memory_order_relaxed);
y.store(1, memory_order_relaxed);
结果r1 = r2 = 1
是可能的,因为每个线程的操作都被放宽并且指向不相关的地址。现在我的问题是关于以下(类似)示例的可能结果:
// Thread 1
r1 = y.load(memory_order_acquire);
x.store(1, memory_order_release);
// Thread 2
r2 = x.load(memory_order_acquire);
y.store(1, memory_order_release);
我认为在这种情况下,结果r1 = r2 = 1
是不可能的。如果可能,y 的负载将与存储同步(因此发生在之前)到 y。与 x 类似,x 的加载会发生在存储到 x 之前。但是 y 的加载是在存储到 x 之前(因此也发生在之前)排序的。这会创建一个循环的先发生关系,我认为这是不允许的。