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

mix atomic and non atomic variables and caches

假设我们有这段代码是正确的(我希望至少):

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 的值(它在循环中等待), 与 [=29 同步=]关系成立。 因此,a.load() 观察到 a.store() 的记忆效应。另一种说法是 a.store() happens-before a.load()