簡體   English   中英

進入例行程序,出現通道死鎖

[英]Go routine with channel deadlock

我剛開始學習Go,所以請多多包涵,我嘗試過Go的例程和頻道,但由於某種原因陷入僵局。

這是例子

package main

import (
    "fmt"
    "sync"
)


func main() {
    total := 2
    var wg sync.WaitGroup
    wg.Add(total)

    ch := make(chan int)

    for idx := 0; idx < total; idx++ {
        fmt.Printf("Processing idx %d\n", idx)

        go func(idx int) {
            defer wg.Done()
            ch <- idx
        }(idx)
    }

    for val := range ch {
        fmt.Println(val)
    }

    fmt.Println("Wait")
    wg.Wait()
}

引發錯誤

Processing idx 0
Processing idx 1
1
0
fatal error: all goroutines are asleep - deadlock!

range chrange ch讀取直到關閉。

您叫多少次close(ch) for val := range ch循環何時終止?


您什么時候應該關閉頻道? 您在這里有很多選擇,但一種方法是添加另一個goroutine:

go func() {
    wg.Wait()
    close(ch)
}()

例如,在分離所有將寫到channel-then- wg.Done() - wg.Done()例程之后,以便一旦所有寫程序完成寫操作,就關閉該通道。 (一旦增加了wg計數以考慮所有編寫者,就可以運行此goroutine。)

暫無
暫無

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

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