首页 > 解决方案 > 为什么我的 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 只是不让我提交问题......所以我只需要添加一些文本......

标签: gogoroutine

解决方案


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)

尝试更改chan1chan2缓冲通道:

chan1 := make(chan string,1)
chan2 := make(chan string,1)

推荐阅读