gpt4 book ai didi

单一读者和单一作者的 Golang 分配安全

转载 作者:数据小太阳 更新时间:2023-10-29 03:46:22 26 4
gpt4 key购买 nike

假设我有两个 go 例程:

var sequence int64

// writer
for i := sequence; i < max; i++ {
doSomethingWithSequence(i)
sequence = i
}

// reader
for {
doSomeOtherThingWithSequence(sequence)
}

那么我可以不用 atomic 吗?

我能想到的一些潜在风险:

  1. 重新排序(对于作者而言,更新 sequence 发生在 doSomething 之前)可能会发生,但我可以接受。

  2. sequence 在内存中未正确对齐,因此读者可能会观察到部分更新的 i。使用 x86_64 在(最新内核)linux 上运行,我们可以排除这种可能性吗?

  3. go 编译器“巧妙地优化”了读取器,因此对 i 的访问永远不会进入内存,而是在寄存器中缓存。这可能吗?

  4. 还有什么吗?

最佳答案

Go 的座右铭:Do not communicate by sharing memory; instead, share memory by communicating .在大多数情况下,这是一种有效的最佳做法。

  1. 如果你关心顺序,你就会关心同步两个 goroutine。
  2. 我认为它们不可能。无论如何,如果您正确设计同步,这些都不是您应该担心的事情。
  3. 同上。

幸运的是,Go 有一个 data race detector融合的。尝试使用 go run -race 运行您的示例。您可能会看到竞争条件发生在 sequence 变量上。

关于单一读者和单一作者的 Golang 分配安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56833406/

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