作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
读取 atomic_uint
的值有什么区别?使用 memory_order_relaxed,并读取 volatile unsigned int
的值(假设 volatile 操作是原子的)?
具体来说,让我们定义:
解决方案一
atomic_uint
(使用任何内存顺序限定符,从 memory_order_relaxed 到 memory_order_seq_cst)atomic_uint
执行原子松弛读取方案二
volatile unsigned int
照原样,我知道这两种情况都不对读者阅读作者所写值(value)的能力提供任何保证。我想了解的是 volatile 读取和 relaxed 原子读取之间的区别。在考虑写后读的一致性时,一个提供了另一个没有提供什么?
我看到的唯一区别是:
还有什么事吗?
最佳答案
volatile 读取不保证是原子的。这意味着您可以读取从未写入变量的值(并且也永远不会被程序的任何部分写入)。例如。如果您的应用程序仅将 0xAAAAAAAA
或 0xBBBBBBBB
写入变量,则 volatile 读取可能会产生 0xAAAABBBB
。或者其他任何东西,因为标准没有指定 volatile 读写在没有其他同步方式的情况下出现在不同线程中时的行为。
我不知道标准是说它是 UB 还是定义的实现。我只能说有些实现(例如 MSVC 2005)将非同步 volatile 读/写的行为定义为扩展。
关于c++ - memory_order_relaxed 负载与易变负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843254/
我是一名优秀的程序员,十分优秀!