Go channel发送和接收什么情况下会死锁?

本文阅读 2 分钟
首页 golang 正文

死锁:

  • 单个协程永久阻塞
  • 两个或两个以上的协程的执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞的现象。

channel死锁场景:

  • 非缓存channel只写不读
  • 非缓存channel读在写后面
  • 缓存channel写入超过缓冲区数量
  • 空读
  • 多个协程互相等待
  1. 非缓存channel只写不读
func deadlock1() {
ch := make(chan int) 
ch <- 3 //  这里会发生一直阻塞的情况,执行不到下面一句
}
  1. 非缓存channel读在写后面
func deadlock2() {
ch := make(chan int)
ch <- 3  //  这里会发生一直阻塞的情况,执行不到下面一句
num := <-ch
fmt.Println("num=", num)
}

func deadlock2() {
ch := make(chan int)
ch <- 100 //  这里会发生一直阻塞的情况,执行不到下面一句
go func() {
num := <-ch
fmt.Println("num=", num)
}()
time.Sleep(time.Second)
}
  1. 缓存channel写入超过缓冲区数量
func deadlock3() {
ch := make(chan int, 3)
ch <- 3
ch <- 4
ch <- 5
ch <- 6  //  这里会发生一直阻塞的情况
}
  1. 空读
func deadlock4() {
ch := make(chan int)
// ch := make(chan int, 1)
fmt.Println(<-ch)  //  这里会发生一直阻塞的情况
}
  1. 多个协程互相等待
func deadlock5() {
ch1 := make(chan int)
ch2 := make(chan int)
// 互相等对方造成死锁
go func() {
for {
select {
case num := <-ch1:
fmt.Println("num=", num)
ch2 <- 100
}
}
}()

for {
select {
case num := <-ch2:
fmt.Println("num=", num)
ch1 <- 300
}
}
}
本文来自投稿,不代表本站立场,如若转载,请注明出处:
如何限制 goroutine 并发数量 (channel 或 WaitGroup)
« 上一篇 09-17
分片键的选择?
下一篇 » 09-17

发表评论

发表评论