登录
首页 >  Golang >  Go问答

数据竞争的原因是什么

来源:stackoverflow

时间:2024-02-10 09:30:26 318浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《数据竞争的原因是什么》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

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


正确答案


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

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

goroutine 在 /* w */ 标记的行处修改调用者的 rpc.result 字段。这是最容易理解的部分。

/* r */ 标记的行处的方法调用是 (*rpc).version() 的语法糖。接收者值在方法调用时复制,包括 result 字段。读取与 /* w */ 处的写入是并发的,因此是数据竞争。尽管程序不对复制的 result 字段执行任何操作,但这仍然是一场数据竞争。

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

func (*RPC) version() int {
    return 1
}

以上就是《数据竞争的原因是什么》的详细内容,更多关于的资料请关注golang学习网公众号!

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