簡體   English   中英

sync.WaitGroup-為什么.wait()之后出現go例程

[英]sync.WaitGroup - why one go routine comes after .wait()

從以下內容中我得到:
包裝收到的蛋糕:草莓蛋糕
包裝收到的蛋糕:草莓蛋糕
包裝收到的蛋糕:草莓蛋糕
包裝收到的蛋糕:草莓蛋糕
我們完了!
包裝收到的蛋糕:草莓蛋糕

我沒想到“我們完成了!” 倒數第二?

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已完成向通道的數據發送,它不會同步“包裝收到的蛋糕”的打印。

當每個人都完成了通道中的數據發送后,該通道中有一項,對嗎? 但等待組已完成。

因此,您遇到了一種競爭情況,其中主goroutine繼續“完成”,接收goroutine接收並打印。 這是不同步的,您不能保證會先發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM