登录
首页 >  Golang >  Go问答

单读者和单作者的 Golang 赋值安全

来源:stackoverflow

时间:2024-04-14 20:03:36 460浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《单读者和单作者的 Golang 赋值安全》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

假设我有两个 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 的访问永远不会进入内存,而是 cached 进入寄存器。这在 go 中可能吗?

  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 赋值安全》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>