sync.WaitGroup疑惑,新手求助

```go package main import( "sync" "fmt" ) func main() { var w sync.WaitGroup var cnt = 0 for i := 0; i != 100; i++{ w.Add(1) go func(i int){ defer w.Done() cnt++ }(i) } w.Wait() fmt.Println(cnt) } ``` 上面代码,多运行几次,输出的情况不一定是100,请问下这是啥情况?
已邀请:

xkey - go

赞同来自: 无节操 go、go、go aQua juntaran

多个线程同时操作同一参数时需要加锁

zdt3476

赞同来自: lifei6671 gch

```go
var mu sync.Mutex
// 省略...
mu.Lock()
cnt++
mu.Unlock()
```

或者是
```go
atomic.AddInt32(&cnt, 1)
```

Mr_Wings - 90后IT

赞同来自: juntaran

你需要了解a = a + 1是一个三步操作,寄存器取a,a+1,放回寄存器,在多线程情况下,这三步操作不能保证原子性。
原子操作或者加锁

wxy

package main

import(
"sync"
"fmt"
"sync/atomic"
)

func main() {
var (
w sync.WaitGroup
mu sync.Mutex
)
var cnt int32= 0
for i := 0; i != 100; i++{
w.Add(1)
go func(i int){
defer w.Done()
mu.Lock()
cnt++
mu.Unlock()
}(i)
}

for i := 0; i != 100; i++{
w.Add(1)
go func(i int){
defer w.Done()
atomic.AddInt32(&cnt, 1)
}(i)
}
w.Wait()
fmt.Println(cnt)
}

pathbox - https://pathbox.github.io/

lz没有 理解 sync.WaitGroup的作用啊
```go

for i := 0; i != 100; i++{
w.Add(1)
go func(i int){
defer w.Done()
atomic.AddInt32(&cnt, 1)
}(i)
}
w.Wait()
fmt.Println(cnt)
```

qiangmzsx - 痛而不言,笑而不语,迷而不失,惊而不乱。

一般都是加锁sync或者原子操作atomic

要回复问题请先登录注册