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

是什么导致了这种数据竞争?

是什么导致了这种数据竞争?

Go
阿波罗的战车 2023-06-01 09:58:48
为什么这段代码会导致数据竞争?我已经使用了原子添加。package mainimport (    "sync/atomic"    "time")var a int64func main() {    for {        if a < 100 {            atomic.AddInt64(&a, 1)            go run()        }    }}func run() {    <-time.After(5 * time.Second)    atomic.AddInt64(&a, -1)}我go run --race用这段代码运行命令并得到:==================WARNING: DATA RACEWrite at 0x000001150f30 by goroutine 8:  sync/atomic.AddInt64()      /usr/local/Cellar/go/1.11.2/libexec/src/runtime/race_amd64.s:276 +0xb  main.run()      /Users/flask/test.go:22 +0x6dPrevious read at 0x000001150f30 by main goroutine:  main.main()      /Users/flask/test.go:12 +0x3aGoroutine 8 (running) created at:  main.main()      /Users/flask/test.go:15 +0x75==================你能帮我解释一下吗?以及如何解决此警告?谢谢!
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您没有在访问变量的所有atomic地方都使用该包。所有访问都必须同步到从多个 goroutines 同时访问的变量,包括读取:


for {

    if value := atomic.LoadInt64(&a); value < 100 {

        atomic.AddInt64(&a, 1)

        go run()

    }

}

随着这种变化,竞争条件消失了。


如果你只是想检查这个值,你甚至不需要将它存储在一个变量中,所以你可以简单地做:


for {

    if atomic.LoadInt64(&a) < 100 {

        atomic.AddInt64(&a, 1)

        go run()

    }

}


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

添加回答

举报

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