我正在阅读 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
}
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消