go的死锁

package main

func main() {
    c, quit := make(chan int), make(chan int)

    go func() {
        //在一个go携程中,2个通道c被堵塞(没被取出),导致quit无法写入
        c <- 1    // c通道的数据没有被其他goroutine读取走,堵塞当前goroutine
        quit <- 0 // quit始终没有办法写入数据
    }()
    <-quit // quit 等待数据的写

}

解决方案,先把c吐出,排通管道,再吐出quit

package main

func main() {
    c, quit := make(chan int), make(chan int)

    go func() {
        //在一个go携程中,2个通道c被堵塞(没被取出),导致quit无法写入
        c <- 1    // c通道的数据没有被其他goroutine读取走,堵塞当前goroutine
        quit <- 0 // quit始终没有办法写入数据
    }()
    <-c    // 先排出c
    <-quit // 再排出quit

}

添加新评论