go - 为什么我的 golang goroutine 代码会死锁
问题描述
我尝试用 channel 写一些 goroutine,但是死锁了,为什么?我对WaitGroup做错了吗,很困惑......
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)
wg.Wait()
close(chan3)
println(<-chan1)
println(<-chan2)
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 ok %s", s)
}
Stackoverflow 只是不让我提交问题......所以我只需要添加一些文本......
解决方案
main 块 on wg.Wait()
,等待这两个 go 例程完成(因为wg.Add(1)
and wg.Done()
)
go makeChanStr("yeye", chan1, chan3)
go makeChanStr("okok", chan2, chan3)
但他们阻止chan1
(or chan2
) ,因为它是一个非缓冲通道。
chan1 := make(chan string)
尝试更改chan1
并chan2
缓冲通道:
chan1 := make(chan string,1)
chan2 := make(chan string,1)
推荐阅读
- ada - 数组初始化方法和内存中存储模式的区别
- javascript - AmChart 仅活动 1 个项目符号
- java - 如何使用 Java 监控 DHCP 流量?
- c++ - 多个对象的线程成员函数
- linkedin - 如何在 Linkedin 上编辑我的专业?
- angular - Angular 6 ActivatedRoute 网址
- qt - Qt QML MapRoute 线路构造不是很好,闪烁
- php - 带有自定义查询的木材分页给了我 404
- c# - 使用 Microsoft.Office.Interop.Outlook 发送电子邮件;带图像附件
- android - Emojis Compat 不显示表情符号