【问题标题】:Why atomic.Value must not be copied after the first Store?为什么 atomic.Value 在第一个 Store 之后一定不能复制?
【发布时间】:2021-05-21 07:50:01
【问题描述】:

Value 提供一致类型值的原子加载和存储。 Value 的零值从 Load 返回 nil。调用 Store 后,不得复制 Value。

我从 atomic.Value 阅读了上述评论。 它说“不得复制一个值”,但没有说明原因。

为什么atomic.Value不能在第一个Store之后复制?

【问题讨论】:

  • 因为如果你复制它,它将无法提供它的意思。为什么?这就是它的实现方式,它是一个实现细节。

标签: go concurrency atomic


【解决方案1】:

为什么atomic.Value不能在第一个Store之后复制?

因为文档是这样说的。

(内部实现需要这个。这里没什么可看的,这个没有可操作的东西。)

【讨论】:

    【解决方案2】:

    除了@Volker 的回答和@icza 的评论之外,推理非常简单:atomic.Value 的实现包括 something 用于提供由类型的保证的原子性合同,直接 - 与包含对此类事物的引用或通常发生的指针相反,因此当 atomic.Value 类型的变量被复制到另一个“事物”被复制的变量时, (克隆)也是。

    现在假设一个实现决定在atomic.Value 类型中包含一个(通常是内核提供的)semaphoremutex,或critical section 或其他任何东西——任何方便的锁定机制。

    现在考虑一个争用的情况:一些 goroutine 尝试读取值,而另一个尝试修改它,并行。 写入 goroutine 通过该内部保护机制“获取”“独占写入权限”——无论它是如何实现的——然后你复制该值。 撇开这种复制创建经典数据竞争案例的问题不谈,您现在可以看到复制的结果将是 两个 类型为 atomic.Value 的变量,每个变量都将被“锁定”获得该独占写入权限。 但是,当原始变量保持在合理状态时——想要更新变量的 goroutine 最终将完成并“释放”它的许可,将变量返回到正常状态,副本将永远锁定在那个状态“获取更新”状态而没有打算执行该更新的 goroutine。 糟糕!


    顺便说一句,由于完全相同的原因,您不能在第一次使用 sync.Mutex 变量后复制它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2021-12-09
      相关资源
      最近更新 更多