2 回答
TA贡献1772条经验 获得超5个赞
主块 on ,等待这两个 go 例程完成(因为 和wg.Wait()wg.Add(1)wg.Done())
go makeChanStr("yeye", chan1, chan3)
go makeChanStr("okok", chan2, chan3)
但是它们阻塞(或),因为它是一个无缓冲信道。chan1chan2
chan1 := make(chan string)
尝试更改 和 缓冲通道:chan1chan2
chan1 := make(chan string,1)
chan2 := make(chan string,1)
TA贡献1893条经验 获得超10个赞
此代码在主 goroutine 中阻止,并在 worker 中写入。为了避免这种情况 - 从和之前读取,从而取消阻止工作线程,并且他们不会阻止写入缓冲。因此,将调用并且不会阻止主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 关注
- 77 浏览
添加回答
举报