gpt4 book ai didi

c++ - 并发读取非原子变量

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:30 25 4
gpt4 key购买 nike

我在尝试实现共享指针时遇到了这个问题。让我们关注托管数据指针。它的生命周期可分为三个阶段:

  1. 没有并发访问的构造。
  2. 并发读取(无写入)。
  3. 在没有并发访问的情况下进行销毁。这是由引用计数保证的。

我的问题是,鉴于这种情况,指针是否有必要是原子的?我认为这等同于:如果指针不是原子的,阶段 2 会导致未定义的行为吗?理想情况下,我想听到从理论(语言律师)的角度和实践的角度讨论的答案。例如,如果不是原子的,理论上阶段 2 可能是未定义的行为,但在实际平台上实际上是可以的。为了实现共享指针,如果非原子是可以的,托管指针可以是unique_ptr<T> , 否则它必须是 atomic<T*> .

更新

我找到了标准文本(第 1.10 节 p21):

The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior.

我想并发读取不会被归类为冲突操作。有人可以找到一些关于此的标准文本来确定吗?

最佳答案

并发读取任何变量,无论是否是原子的,都不会构成数据竞争,因为在 [intro.multithread] 中发现了冲突评估的定义:

Two expression evaluations conflict if one of them modifies a memory location and the other one accesses or modifies the same memory location.

最近,这已经转移到[intro.races],措辞上有非常微妙的变化

Two expression evaluations conflict if one of them modifies a memory location and the other one reads or modifies the same memory location.

访问读取的变化发生在草案 n4296 和 n4431 之间。多线程部分的拆分发生在n4582和n4604之间。

关于c++ - 并发读取非原子变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48854896/

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