c++ - 混合原子和非原子变量和缓存

标签 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; , 这也是正确的吗?还是存在缓存刷新/失效的问题?

最佳答案

不管这是不是个好主意,举个例子,你的代码没问题..

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

Certain library calls synchronize with other library calls performed by another thread. For example, an atomic store-release synchronizes with a load-acquire that takes its value from the store

由于 threadB 加载了 threadA 存储的 ready 的值(它在循环中等待它),同步-with 关系建立。 因此,a.load() 观察到 a.store() 的内存效应。另一种说法是 a.store() happens-before a.load()

关于c++ - 混合原子和非原子变量和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45689529/

相关文章:

c++ - CUDA 7.5 实验性 __host__ __device__ lambda

c# - BlockingQueue 以何种方式阻塞?

java - 如何同步两个方法?

c++ - 如何区分重载函数的左值和右值成员函数指针?

c++ - 如何初始化非静态的 const 成员

c++ - 如何在qt中检测屏幕分辨率?

c++ - 如何创建一个圆柱形骨骼,存储为由 2 个点(头、尾)组成的 vector ?

c++ - 在 Linux 上运行 MFC 程序

java - 异步任务UI更新

c++11 - 如何定义此提升精神规则的AST?