考虑以下代码
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
messages := make(chan bool)
var wg sync.WaitGroup
var x = 1000
wg.Add(runtime.NumCPU())
for i := 0; i < runtime.NumCPU(); i++ {
go func(x int) {
defer wg.Done()
var i = 0
for i < x {
i += 1
fmt.Println(i * i)
}
messages <- true
}(x)
}
go func() {
for i := range messages {
fmt.Println(i)
}
}()
wg.Wait()
}
以下几行输出
980100
982081
984064
true
988036
990025
992016
994009
996004
998001
1000000
由于message <- true
始终位于for循环和
for i := range messages {
fmt.Println(i)
}
在频道收到消息后打印。
我希望true
始终打印在
988036
990025
992016
994009
996004
998001
1000000
true
但我发现这有时只是真的,为什么会这样?
答案 0 :(得分:3)
您正在做的是:
messages
频道读取并打印值。因为您只是等待第一批goroutine终止,所以无法保证在程序终止之前将打印所有(甚至任何)messages
值。