鉴于以下情况:package mainimport ( "fmt" "sync")func main() { n := 100 var wg sync.WaitGroup wg.Add(n) x := 0 for i := 0; i < n; i++ { go func() { defer wg.Done() x++ }() } wg.Wait() fmt.Println(n, x)}我希望在最后打印时x总是到达100,但有时打印低至95. 我在这里缺少什么?
2 回答
catspeake
TA贡献1111条经验 获得超0个赞
有一场比赛x。一种解决方法是x使用互斥锁进行保护:
var mu sync.Mutex
var wg sync.WaitGroup
wg.Add(n)
x := 0
for i := 0; i < n; i++ {
go func() {
defer wg.Done()
mu.Lock()
x++
mu.Unlock()
}()
}
wg.Wait()
fmt.Println(n, x)
我建议在 Go 程序中有多个 goroutine 时发现一些令人费解的事情时运行竞态检测器。
FFIVE
TA贡献1797条经验 获得超6个赞
使用 sync.atomic 方法以原子方式访问 x。
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
n := 100
var wg sync.WaitGroup
wg.Add(n)
var x int32
for i := 0; i < n; i++ {
go func() {
defer wg.Done()
atomic.AddInt32(&x, 1)
}()
}
wg.Wait()
fmt.Println(n, x)
}
- 2 回答
- 0 关注
- 132 浏览
添加回答
举报
0/150
提交
取消