【发布时间】:2010-05-26 11:54:30
【问题描述】:
当前C++0x draft 在第 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 之前(因此也发生在之前)排序的。这会创建一个我认为不允许的循环发生之前的关系。
【问题讨论】:
-
我更改了标题,因为问题本身与投机商店无关。对于投机商店,请参阅stackoverflow.com/questions/2001913/…
-
存储推测是这里的关键字,因为结果
r1=r2=1要求在两次读取之前对存储进行重新排序(“推测”)。你的标题太模糊了。 -
C++0x 工作论文上下文中的推测存储指的是编译器推测,请参阅我在之前的评论中链接到的问题。您的问题与硬件所做的重新排序有关(取决于硬件架构实现的共享内存一致性模型),以及 C++0x 如何通过发出各种内存屏障指令来提供约束此内存重新排序的设施。因此我觉得我提供的标题比原来的更合适;但是,嘿,这是您的问题,所以请随意将其更改为您想要的任何内容。
标签: c++ c++11 memory-model