首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sync.WaitGroup -为什么在.wait()之后有一个go例程

sync.WaitGroup -为什么在.wait()之后有一个go例程
EN

Stack Overflow用户
提问于 2016-01-03 19:02:21
回答 1查看 359关注 0票数 0

从以下内容中我可以得到:

包装收到的蛋糕:草莓蛋糕

包装收到的蛋糕:草莓蛋糕

包装收到的蛋糕:草莓蛋糕

包装收到的蛋糕:草莓蛋糕

我们完事了!

包装收到的蛋糕:草莓蛋糕

我没想到“我们完蛋了!”是倒数第二吗?

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-03 19:11:36

这是非常正常的。在我们继续之前,wg.Wait()确保所有的goroutines都完成了向通道发送数据,它不会同步“打包收到的蛋糕”的打印。

当每个人都完成向通道发送数据时,通道中有一个条目,对吗?但是Waitgroup已经结束了。

因此,您有一个竞争条件,其中主goroutine继续显示“我们完成了”,而接收goroutine接收并打印。这是不同步的,您不能保证哪一个会最先发生。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34575778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档