混合原子和非原子变量和缓存

时间:2017-08-15 08:50:23

标签: c++ multithreading c++11 atomic

让我们说这段代码是正确的(我希望至少):

std::atomic<int> a;
std::atomic<bool> ready{false};
void threadA() {
    a.store(666, std::memory_order_relaxed);
    ready.store(true, std::memory_order_release);
}

void threadB() {
    while(!ready.load(std::memory_order_acquire));
    process(a.load(std::memory_order_relaxed));
}

我的问题是:如果您使用的是int a;而不是std::atomic<int> a;,那么它也是正确的吗?或者是否存在缓存刷新/失效的问题?

1 个答案:

答案 0 :(得分:1)

这是否是一个好主意,例如,你的代码很好..

您可以将a的原子类型替换为常规int(或任何类型)。
C ++标准使用以下短语(第1.10.1-6节)支持您的案例:

  

某些库调用与另一个线程执行的其他库调用同步。例如,原子存储释放与从存储

获取其值的load-acquire同步

由于threadB加载了由ready存储的threadA的值(它正在循环中等待它),因此建立了 synchronize-with 关系。 因此,a.load()会观察a.store()的记忆效应。另一种说法是a.store() 发生在 a.load()之前