码迷,mamicode.com
首页 > 其他好文 > 详细

Channel 的死锁

时间:2018-09-22 23:19:02      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:并且   死锁   准备就绪   channel   goroutine   出现   取数据   fun   没有   

Channel 的死锁

  • 1没有缓冲区的channel

代码1

func f(){
    ch := make(chan int)
    ch <- 1
    fmt.Println(<-ch)
}

代码2

func f(){
    ch := make(chan int,1)
    ch <- 1
    fmt.Println(<-ch)
}

以上代码中代码1会死锁,代码2不会死锁
因为在吗1 中的channel没有缓冲区,而代码2中的channel有缓冲区
没有缓冲区的channel只能通过goroutine去读,否则就会发生死锁

  • 2 channel 如果有缓冲区,并且不适用goroutine,则必须先写后读

如下代码会发生死锁

func f(){
    ch := make(ch int ,1)
    fmt.Println(<-ch)
    ch<-1
}
  • 3 channel 的缓冲区已满继续写入时会发生死锁
func f(){
    ch := make(chan int,1)
    ch <- 1
    ch <- 2 // 死锁,缓冲区已经满了。继续写入
    fmt.Println(<-ch)
}

由此可见channel的死锁可以确认为向缓冲区已满的channel中写入数据,或者从缓冲区为空的channel中读取数据导致。
即.如果channel没有缓冲区,则在向channel写入数据时必须有一个goroutine已经准备就绪读取数据

如果channel带有缓冲区,则必须在缓冲区未满的时候写入数据否则就会死锁

在读取缓冲区数据时必须等缓冲区有数据才可以读取。否则就会出现死锁。除非使用 goroutine

Channel 的死锁

标签:并且   死锁   准备就绪   channel   goroutine   出现   取数据   fun   没有   

原文地址:https://www.cnblogs.com/pmsl/p/9691454.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!