从下面我得到:
包装收到蛋糕:草莓蛋糕
包装收到蛋糕:草莓蛋糕
包装收到蛋糕:草莓蛋糕
包装收到蛋糕:草莓蛋糕
我们完成了!
包装收到蛋糕:草莓蛋糕
我没想到“我们完成了!”倒数第二?
package main
import (
"fmt"
// "strconv"
// "time"
"sync"
)
func makeCakeAndSend(cs chan string, wg *sync.WaitGroup) {
cakeName := "Strawberry Cake "
cs <- cakeName
wg.Done()
}
func receiveCakeAndPack(cs chan string) {
for s := range cs {
fmt.Println("Packing received cake: ", s)
}
}
func main() {
var wg sync.WaitGroup
cs := make(chan string)
wg.Add(5)
for i := 1; i <= 5; i++ {
go makeCakeAndSend(cs, &wg)
}
// go receiveCakeAndPack(cs)
go func() {
for s := range cs {
fmt.Println("Packing received cake: ", s)
}
close(cs)
}()
wg.Wait()
fmt.Println("We are done!")
var input string
fmt.Scanln(&input)
}
最佳答案
这很正常。 wg.Wait()
确保所有 goroutine 在我们继续之前完成向 channel 发送数据,它不会同步“Packing received cake”的打印。
当每个人都完成了向 channel 发送数据时, channel 中有一项,对吧?但是 Waitgroup 已经完成了。
所以你有一个竞争条件,主 goroutine 继续“我们完成了”,接收 goroutine 接收并打印。这不是同步的,您无法保证哪个会先发生。
关于go - sync.WaitGroup - 为什么在 .wait() 之后出现一个 go 例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34575778/