loops - WaitGroup 不受双重尊重
问题描述
我正在关注不同的示例教程,我在嵌套两个循环时遇到问题。
我想要的是
sum变量必须给出 2500
结果
总和 = 2298、2266、2254
就像循环没有给你时间结束
package main
import (
"fmt"
"sync"
"time"
)
var iterate = 50
var sum = 0
func main() {
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()
sum++
time.Sleep(5 * time.Millisecond)
}()
}
}
wg.Wait()
timeEnd := time.Now().Sub(timeStart)
fmt.Println(timeEnd, sum)
}
解决方案
正如评论中指出的那样。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)
}
推荐阅读
- javascript - By transform scaleX (-1) item goes out of the screen?
- angular - Cannot determine the module for class TimeAgoPipe
- python - Python3 - Plotting the same matplotlib axes object on multiple figures?
- android - Getting this android.view.ViewRootImpl cannot be cast to android.view.View
- html - Is there any way to select for the native placeholder of an input[type=date] in browsers other than Chrome?
- r - Need to copy speicific columns from 1 data frame to another in r studio
- javascript - 当变量达到特定数字时如何执行操作javascript
- shell - Does a shell script add any escapes to the quotes it encounters in it's arguments?
- python - 如何读取中间件的所有日志?
- c# - 如何通过 Puppeteer-Sharp 找到特定 div 内的所有链接