- 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/
给定: std::atomic x; uint64_t f() { x.store(20, std::memory_order::memory_order_relaxed); x.st
在 ThreadMethodOne 中加载时放宽变量 valA 和 valB 同步的最正确方法是什么(假设不存在 valA 和 valB 的虚假高速缓存行共享)?似乎我不应该将 ThreadMetho
假设线程 1 正在对变量 v 进行原子存储使用 memory_order_release (或任何其他顺序)并且线程 2 正在对 v 执行原子读取使用 memory_order_relaxed . 在
Stackoverflow 上已经有一些问题本质上是关于 memory_order_relaxed 的用例,例如: Understanding memory_order_relaxed What ar
C++ 内存模型放宽了原子性,不对内存操作提供任何顺序保证。除了我在这里找到的 C 中的邮箱示例: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1
Cppreference 给出 following example关于memory_order_relaxed: Atomic operations tagged memory_order_relax
读取 atomic_uint 的值有什么区别?使用 memory_order_relaxed,并读取 volatile unsigned int 的值(假设 volatile 操作是原子的)? 具体来
我试图了解 memory_order_relaxed 的细节。我指的是这个链接:CPP Reference . #include #include std::atomic ptr {nullptr
考虑以下摘自 Herb Sutter 关于原子的演讲的代码片段: smart_ptr 类包含一个名为 control_block_ptr 的 pimpl 对象,其中包含引用计数 refs。 // Th
我在看 this article来自 GCC Wiki 关于 C++ 内存屏障(及其很棒的)。 在我到达这一点之前,它非常简单: 相反的方法是 std::memory_order_relaxed。该模
据我所知,memory_order_relaxed 是为了避免昂贵的内存栅栏,这可能需要在特定架构上进行更多约束排序。在那种情况下,如何在流行的处理器上实现原子变量的总修改顺序? 编辑: atomic
下面是否保证打印 1 后跟 2? auto&& atomic = std::atomic{0}; std::atomic* pointer = nullptr; // thread 1 auto&&
我有一个写入原子变量的线程。 (使用 memory_order_release)。 线程 A 还有许多其他线程读取该变量。 (使用 memory_order_acquire)。 线程 B。 在线程 A
关于内存顺序的 cppreference 文档说 Typical use for relaxed memory ordering is incrementing counters, such as t
我正在研究这个网站:https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync ,这对理解关于原子类的话题非常有帮助。 但是这个放松模式的例子很难理解:
假设我有一个线程 A 写入 atomic_int x = 0;,使用 x.store(1, std::memory_order_relaxed);。如果没有任何其他同步方法,使用 x.load(std
在以下代码中使用 std::memory_order_relaxed 是否正确? #include #include #include #include using namespace std
我正在研究 C++ 内存序列,但它很困惑。 例如: void sumUp(std::atomic& sum, std::vector& val) { int tmpSum = 0; for
C++ 标准规定,原子上的 RMW(读-修改-写)操作将对原子变量的最新值进行操作。因此,当从多个线程并发执行时,对这些操作使用 memory_order_relaxed 不会影响 RMW 操作。 我
std::atomic cnt = {2}; thread 1: doFoo(); if (cnt.fetch_sub(1, std::memory_order_relaxed) ==
我是一名优秀的程序员,十分优秀!