【发布时间】:2021-06-20 02:29:32
【问题描述】:
golang:为什么这段代码没有死锁?
请浏览以下代码:
package main
import (
"fmt"
"time"
)
func f1(done chan bool) {
done <- true
fmt.Printf("this's f1() goroutine\n")
}
func f2(done chan bool) {
val := <-done
fmt.Printf("this's f2() goroutine. val: %t\n", val)
}
func main() {
done1 := make(chan bool)
done2 := make(chan bool)
go f1(done1)
go f2(done2)
fmt.Printf("main() go-routine is waiting to see deadlock.\n")
time.Sleep(5 * time.Second)
}
正如所见,go-routine f1() 正在向通道发送一个值。 go-routine f2() 正在从通道接收一个值。 但是,没有从 go-routine f1() 发送到的通道接收 go-routine。 同样,没有 go-routine 发送到 go-routine f2() 正在接收的通道上。
【问题讨论】:
-
只是因为当 5 秒的睡眠过去后,
maingoroutine 可以继续进行。在死锁中,没有一个 goroutine 可以继续,永远。 -
@mh-cbon:代码中有两个不同的渠道
-
你不会“等待”死锁,它与 goroutine 的非活动时间无关多长时间
-
@HymnsForDisco 绝对是。这里的等待是经过深思熟虑的,我只想说明一点,不管主 go-routine 等待了多长时间,它仍然不是死锁的情况。
-
@EliBendersky 另外,2 个不同的频道不会有任何区别,IMO。