首页 > 其他分享 >channel 死锁

channel 死锁

时间:2022-11-30 16:57:10浏览次数:40  
标签:ch int make chan 死锁 func channel

死锁:

 - 单个协程永久阻塞

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

channel 死锁场景:

 - 非缓存channel只写不读

 - 非缓存channel读在写后面

 - 缓存channel写入超过缓冲区数量

 - 空读

 - 多个协程互相等待

1、非缓存chanel只写不读

func deadlock1(){
    ch :=make(chan int)
    ch <-3  //这里会发生一直阻塞的情况,执行不到下一句
}

2、非缓存channel读在写后面

func deadlock2(){
    ch :=make(chan int)
    ch <-3
    num :=<-ch
   fmt.Println("nums",num)
}
func deadlocak2(){
    ch1 :=make(chan int)\
    ch <-100   //这里会发生一直阻塞的情况,执行不到下一句
    go func() {
         num := <-ch
         fmt.Println("num=",num)
    }()
    time.Sleep(time.Second)
}

3、缓存channel写入超过缓冲区数量

func deadlock3(){
   ch :=make(chan int, 3)
   ch <- 3
   ch <- 4
   ch <- 5
   ch <- 6    //这里会发生一直阻塞的情况
}

4、空读

func deadlock4(){
    ch :=make(chan int)
    fmt.Println(<-ch)   // 这里会发生一直阻塞的情况
}

5、多个协程一直等待

func deadlocak5() {
    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
              } 
    } 
}

 

标签:ch,int,make,chan,死锁,func,channel
From: https://www.cnblogs.com/wuchangblog/p/16938984.html

相关文章