【发布时间】:2016-07-30 12:11:42
【问题描述】:
众所周知,std::memory_order's 有 6 个,其中有 2 个:
- acquire-semantic 用于加载 - 避免重新排序 Load-Load 和 Load-Store
- 用于商店的发布语义 - 避免重新排序 Store-Store 和 Load-Store
即对于acquire-semantic,只有S = local1;可以在X.load(std::memory_order_acquire);之后执行:
static std::atomic<int> X;
static int L, S;
...
void thread_func()
{
int local1 = L; // load(L)-load(X) - !!! can be reordered with X !!!
S = local1; // store(S)-load(X) - !!! can be reordered with X !!!
int x_local = X.load(std::memory_order_acquire); // load(X)
int local2 = L; // load(X)-load(L) - can't be reordered with X
S = local2; // load(X)-store(S) - can't be reordered with X
}
但是load(X) 中的哪些重新排序可以用于消费语义?
static std::atomic<int *> X;
static int L1, L2, S1, S2;
static int L, S;
...
void thread_func()
{
int *x_ptr_local = new int(1);
int local1 = L1; // load(L1)-load(X) - !!! can be reordered with X !!!
S1 = local1; // store(S1)-load(X) - !!! can be reordered with X !!!
int dependent_x1 = *x_ptr_local; // load(x_ptr)-load(X) - !!! can be reordered with X !!!
S = dependent_x1; // store(S)-load(X) - !!! can be reordered with X !!!
x_ptr_local = X.load(std::memory_order_consume); // load(X)
int dependent_x2 = *x_ptr_local; // load(X)-load(x_ptr) - can't be reordered with X
S = dependent_x2; // load(X)-store(S) - can't be reordered with X
int local2 = L2; // load(X)-load(L2) - !!! can be reordered with X !!!
S2 = local2; // load(X)-store(S2) - !!! can be reordered with X !!!
}
真的吗,只有dependent_x2 的操作不能在X.load(std::memory_order_consume) 中重新排序?
所有带有变量L1、L2、S1、S2 和dependent_x1 的操作都可以在X.load(std::memory_order_consume) 中重新排序 - 即可以在X.load(std::memory_order_consume) 之前或之后执行,不是是吗?
【问题讨论】:
-
为什么不能在第一个例子中将
int local1 = L;重新排序到x_local之下? -
@2501 (1)
int local1 = L;不能在 (2)int x_local = X.load(std::memory_order_acquire);下面重新排序,因为两者都是 - 负载和std::memory_order_acquire防止 Load-Load 重新排序 - 如图所示,不是吗? -
我只看到 2 具有获取语义,所以就像
S = local1;可以低于 2,1 也可以乙>。 1有什么特别之处? -
@2501 谢谢!我修复了它,如下所述:stackoverflow.com/questions/38677061/…
-
@Alex,你的第二个例子中的
X不应该是std::atomic<int*>而不是std::atomic<int>*?
标签: c++ multithreading c++11 concurrency stdatomic