2 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
主塊 on ,等待這兩個(gè) go 例程完成(因?yàn)?和wg.Wait()wg.Add(1)wg.Done())
go makeChanStr("yeye", chan1, chan3)
go makeChanStr("okok", chan2, chan3)
但是它們阻塞(或),因?yàn)樗且粋€(gè)無緩沖信道。chan1chan2
chan1 := make(chan string)
嘗試更改 和 緩沖通道:chan1chan2
chan1 := make(chan string,1)
chan2 := make(chan string,1)

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
此代碼在主 goroutine 中阻止,并在 worker 中寫入。為了避免這種情況 - 從和之前讀取,從而取消阻止工作線程,并且他們不會阻止寫入緩沖。因此,將調(diào)用并且不會阻止主goroutine。wg.Wait()c1c1c2wg.Wait()c3wg.Done()wg.Wait()
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
chan1 := make(chan string)
chan2 := make(chan string)
chan3 := make(chan string, 2)
wg.Add(1)
go makeChanStr("yeye", chan1, chan3)
wg.Add(1)
go makeChanStr("okok", chan2, chan3)
println(<-chan1)
println(<-chan2)
wg.Wait()
close(chan3)
for chs := range chan3 {
println(chs)
}
}
func makeChanStr(s string, c1 chan string, c2 chan string) {
defer wg.Done()
c1 <- "get " + s
c2 <- "same value"
fmt.Printf("execute %s\n", s)
}
- 2 回答
- 0 關(guān)注
- 95 瀏覽
添加回答
舉報(bào)