minibear2333 / blog-comment

0 stars 0 forks source link

4 4 Deadlock | Go语言精进之路 #21

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

4 4 Deadlock | Go语言精进之路

4.4 deadlock # 本节源码位置 https://github.com/golang-minibear2333/golang/blob/master/4.concurrent/4.4-deadlock/ 4.4.1 什么时候会导致死锁 # 在计算机组成原理里说过 死锁有三个必要条件他们分别是 循环等待、资源共享、非抢占式,在并发中出现通道

https://golang.coding3min.com/4.concurrent/4-4-deadlock/

minibear2333 commented 3 years ago

补充,在有缓冲的channel中,虽然通道关闭了,但直到读取完成所有数据才会输出0值,以及二值时返回false

xyf1096415969 commented 3 years ago

chanInt := make(chan int) go func() { chanInt <- 1 }()

res := <-chanInt

这段代码,他如果先执行res := <-chanInt,主协程就关闭了,那么其他协程不也关闭了,导致chanInt <- 1还没执行就被关闭,这样会不会死锁?【当main()函数返回的时候该goroutine就结束了,所有在main()函数中启动的goroutine会一同结束】

minibear2333 commented 3 years ago

chanInt := make(chan int) go func() { chanInt <- 1 }()

res := <-chanInt

这段代码,他如果先执行res := <-chanInt,主协程就关闭了,那么其他协程不也关闭了,导致chanInt <- 1还没执行就被关闭,这样会不会死锁?【当main()函数返回的时候该goroutine就结束了,所有在main()函数中启动的goroutine会一同结束】

不可能先执行res := <-chanInt的,会阻塞

xyf1096415969 commented 3 years ago

不可能先执行res := <-chanInt的? 先运行的res := <-chanInt还是先运行到chanInt <- 1 这个是随机的吧?运行到哪个都会阻塞我知道的

minibear2333 commented 3 years ago

不可能先执行res := <-chanInt的? 先运行的res := <-chanInt还是先运行到chanInt <- 1 这个是随机的吧?运行到哪个都会阻塞我知道的

是的,可以理解为几乎同时,如果先到接收处会阻塞,不会退出主协程;如果先发送,会阻塞等待接收,接收到后退出,具体如果还有疑问也可以加我微信 qupzhi 拉群讨论

william-xue commented 2 years ago

需要动手体会

VHcat commented 6 months ago

go-version 1.22.1

模拟 goroutine 泄露的代码我按文中的方式无法复现持续输出 0 0 0 0 ... 的现象 改了一下按下面的方式可以发现 goroutine 泄露

func main() {

    chanInt := make(chan int)

    go func() {
        for {
            res := <-chanInt
            fmt.Println(res)
        }
    }()

    chanInt <- 1
    chanInt <- 1
    close(chanInt)

    time.Sleep(time.Second * 1)
}