為什么這段代碼會導致數據競爭?我已經使用了原子添加。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 同時訪問的變量,包括讀?。?/p>
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 關注
- 127 瀏覽
添加回答
舉報
0/150
提交
取消