我正在閱讀 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 關注
- 115 瀏覽
添加回答
舉報
0/150
提交
取消