为什么这段代码会导致数据竞争?我已经使用了原子添加。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()
}
}
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报
0/150
提交
取消