为了账号安全,请及时绑定邮箱和手机立即绑定

为什么会有数据竞争

为什么会有数据竞争

Go
慕侠2389804 2023-02-06 11:23:49
我正在阅读 Dave Cheney 的帖子https://dave.cheney.net/2015/11/18/wednesday-pop-quiz-spot-the-race,但无法理解为什么该示例包含数据竞争。有人可以向我解释吗?
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

这是博客文章中的相关代码:


func (rpc *RPC) compute() {

    time.Sleep(time.Second)

    rpc.result = 42   /* W */

    close(rpc.done)

}


func (RPC) version() int {

    return 1

}


go rpc.compute()         

version := rpc.version() /* R */

<-rpc.done              

goroutinerpc.result在由 标记的行修改调用者的字段/* W */。这是容易理解的部分。


注释行中的方法调用/* R */是 的语法糖(*rpc).version()。接收者值在方法调用时被复制,包括result字段。读取与写入并发,/* W */因此是数据竞争。虽然程序没有对复制的result字段做任何事情,但它仍然是一场数据竞赛。


version()通过更改使用指针接收器的方法来修复:


func (*RPC) version() int {

    return 1

}


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信