混合原子和非原子变量和缓存
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(支持您的情况:
与另一个线程执行的其他库调用同步。例如,原子存储发布与从存储中获取其值的加载获取同步
由于threadB
加载threadA
存储的ready
的值(它在循环中等待它(,因此建立了同步关系。 因此,a.load()
观察a.store()
的记忆效应。 另一种说法是,a.store()
发生在a.load()
之前
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- cmake更新缓存的变量
- 是否可以检查变量是否位于 L1/L2/L3 缓存中
- dynamic_cast每次调用是否比具有空检查的缓存变量更昂贵?
- 混合原子和非原子变量和缓存
- 缓存行大小的倍数的变量的缓存行填充
- TLS变量访问的结果未缓存
- 做静态变量会阻碍数据缓存
- Can编译器有时会缓存声明为volatile的变量
- 映射查找函数调用 Vs 将查找缓存为静态变量
- 与linux信号/条件变量相比,缓存一致性开销
- 在C++中,我应该费心缓存变量,还是让编译器进行优化?(别名)
- 什么是寄存器缓存,它与const变量有什么关系
- 如何阻止VS2K10缓存环境变量