为什么会有数据竞争

我正在阅读 Dave Cheney 的帖子https://dave.cheney.net/2015/11/18/wednesday-pop-quiz-spot-the-race,但无法理解为什么该示例包含数据竞争。有人可以向我解释吗?



慕侠2389804
浏览 99回答 1
1回答

繁花如伊

这是博客文章中的相关代码:func (rpc *RPC) compute() {&nbsp; &nbsp; time.Sleep(time.Second)&nbsp; &nbsp; rpc.result = 42&nbsp; &nbsp;/* W */&nbsp; &nbsp; close(rpc.done)}func (RPC) version() int {&nbsp; &nbsp; return 1}⋮go rpc.compute()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;version := rpc.version() /* R */<-rpc.done&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;goroutinerpc.result在由 标记的行修改调用者的字段/* W */。这是容易理解的部分。注释行中的方法调用/* R */是 的语法糖(*rpc).version()。接收者值在方法调用时被复制,包括result字段。读取与写入并发,/* W */因此是数据竞争。虽然程序没有对复制的result字段做任何事情,但它仍然是一场数据竞赛。version()通过更改使用指针接收器的方法来修复:func (*RPC) version() int {&nbsp; &nbsp; return 1}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go