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

mix atomic and non atomic variables and caches

本文关键字:缓存 变量 混合      更新时间:2023-10-16

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

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(支持您的情况:

某些库调用

与另一个线程执行的其他库调用同步。例如,原子存储发布与从存储中获取其值的加载获取同步

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