gpt4 book ai didi

c++ - memory_order_relaxed 负载与易变负载

转载 作者:太空狗 更新时间:2023-10-29 21:39:55 27 4
gpt4 key购买 nike

读取 atomic_uint 的值有什么区别?使用 memory_order_relaxed,并读取 volatile unsigned int 的值(假设 volatile 操作是原子的)?

具体来说,让我们定义:

解决方案一

  1. “编写器”线程写入 atomic_uint(使用任何内存顺序限定符,从 memory_order_relaxed 到 memory_order_seq_cst)
  2. “读取器”线程对同一 atomic_uint 执行原子松弛读取

方案二

  1. “writer”线程写入一个volatile unsigned int
  2. “读取器”线程读取该值

照原样,我知道这两种情况都不对读者阅读作者所写值(value)的能力提供任何保证。我想了解的是 volatile 读取和 relaxed 原子读取之间的区别。在考虑写后读的一致性时,一个提供了另一个没有提供什么?

我看到的唯一区别是:

  • volatile 操作不能在它们之间重新排序,而原子负载可以与其他原子操作重新排序

还有什么事吗?

最佳答案

volatile 读取不保证是原子的。这意味着您可以读取从未写入变量的值(并且也永远不会被程序的任何部分写入)。例如。如果您的应用程序仅将 0xAAAAAAAA0xBBBBBBBB 写入变量,则 volatile 读取可能会产生 0xAAAABBBB。或者其他任何东西,因为标准没有指定 volatile 读写在没有其他同步方式的情况下出现在不同线程中时的行为。

我不知道标准是说它是 UB 还是定义的实现。我只能说有些实现(例如 MSVC 2005)将非同步 volatile 读/写的行为定义为扩展。

关于c++ - memory_order_relaxed 负载与易变负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com