Как указано в комментариях. sum
должен быть защищен sync.Mutex
, блокировка перед изменением sum
и разблокировка после. Измененный код, как показано ниже, распечатает 2500.
package main
import (
"fmt"
"sync"
"time"
)
var iterate = 50
var sum = 0
func main() {
m := sync.Mutex{}
timeStart := time.Now()
var wg sync.WaitGroup
for i := 0; i < iterate; i++ {
for i2 := 0; i2 < iterate; i2++ {
wg.Add(1)
go func() {
defer wg.Done()
m.Lock()
sum++
m.Unlock()
time.Sleep(5 * time.Millisecond)
}()
}
}
wg.Wait()
timeEnd := time.Now().Sub(timeStart)
fmt.Println(timeEnd, sum)
}