- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定:
std::atomic<uint64_t> x;
uint64_t f()
{
x.store(20, std::memory_order::memory_order_relaxed);
x.store(10, std::memory_order::memory_order_relaxed);
return x.load(std::memory_order::memory_order_relaxed);
}
f
是否有可能返回 10
以外的值,假设只有一个线程写入 x
?对于非原子变量,这显然不是真的,但我不知道 relaxed 是否放松到会忽略同一线程中的数据依赖性?
最佳答案
加载的结果总是10(假设只有一个线程)。即使是宽松的原子变量也比非原子变量“更强”:
一个松散的原子变量不能用于同步不同的线程,除非伴随着显式的栅栏。与适用于原子变量的其他内存排序相比,这就是它放松的意义。
对于语言律师,请参阅 C++20 [intro.races]/10:
An evaluation A happens before an evaluation B (or, equivalently, B happens after A) if:
- A is sequenced before B, or [...]
和[intro.races]/15:
If an operation A that modifies an atomic object M happens before an operation B that modifies M, then A shall be earlier than B in the modification order of M. [Note: This requirement is known as write-writecoherence. — end note]
和[intro.races]/18:
If a side effect X on an atomic object M happens before a value computation B of M , then the evaluation B shall take its value from X or from a side effect Y that follows X in the modification order of M. [Note: This requirement is known as write-read coherence. — end note]
因此,在您的程序中,20 的存储发生在 10 的存储之前(因为它在它之前排序)并且 10 的存储发生在加载之前。写写一致性要求保证10的store在x
的修改顺序中比20的store晚出现。当负载发生时,要求从10的store取值,因为 10 的存储发生在它之前,并且没有其他修改可以按照 x
的修改顺序跟在 10 的存储之后。
关于c++ - memory_order_relaxed 是否尊重同一线程内的数据依赖性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69725529/
有很多可用的单行 HTTP 服务器,例如 python python -m SimpleHTTPServer 8000 ruby ruby -run -ehttpd . -p8000 等等 是否有任何
我是一名优秀的程序员,十分优秀!