登录
首页 >  Golang >  Go问答

Golang 的整数读取需要锁

来源:stackoverflow

时间:2024-03-14 20:51:25 367浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《Golang 的整数读取需要锁》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

在《the go 编程语言》中,alan donovan,第 264 页,他使用互斥体来读取 int。

我不明白为什么,因为 int 适合一个单词,所以它不能被撕裂。

我可能错了,但是怎么错呢?谢谢。

--- 使用代码更新 ---

func balance() int {
  mu.lock()
  defer mu.unlock()
  return balance
}

然后向下翻页

func Withdraw(amount int) bool {
  Deposit(-amount)
  if Balance() < 0 {
    Deposit(amount)
    return false // insufficient funds
  }
}

这种设计让余额变得无效,读者可以观察到这一点,然后通过锁定 withdraw() 函数在书中修复。

真的很抱歉,我认为我浪费了每个人的时间:(我让每个人都无法正确回答这个问题。

我的理论是,如果 balance 变量被检查(在锁定状态下)在它发生变异之前有足够的资金,那么就不需要 balance() 函数中的锁定,但我仍然可能是错的,尤其是正如人们提到的,重新排序有点神秘。


解决方案


如果你有一个 goroutine,则不需要特殊的方法来读取和写入变量。

如果您有多个 Goroutine,则对从多个 Goroutine 访问的变量的访问必须同步,并且至少其中一个访问是写入。

引用自The Go Memory Model

尽管 Go 鼓励另一种方法:

因此,不应使用锁来保护变量,而应使用 channels 将新值和计算结果发送到需要使用的地方,这样就不需要读取共享变量了。通道对于并发使用是安全的,设计上不会发生数据竞争。

本篇关于《Golang 的整数读取需要锁》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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