zoukankan      html  css  js  c++  java
  • golang 死锁 all goroutines are asleep

    channel死锁

    package main
    
    import "fmt"
    
    func main() {
    
    	ch := make(chan string)
    
    	for i := 0; i < 10; i++ {
    		s := <- ch
    		fmt.Println(s)
    	}
    
    	go func(ch chan string) {
    		for i := 0; i < 10; i++ {
    			ch <- fmt.Sprintf("%d", i)
    		}
    
    	}(ch)
    
    
    }
    

    报错

    all goroutines are asleep - deadlock!
    

    分析:无缓冲通道,只有接收端和发送端都准备好才会通过channel传输数据,所以main方法执行到s := <- ch这行代码会一直阻塞等待接收端准备好才能往下运行,而阻塞后接受端的代码就会一直运行不到,就会产生死锁。

    解决

    思路:先开启一个协程让运行接收端/发送端,main主协程继续往下执行。两个协程(接收断/发送端)都准备好后,就开始传输数据。

    package main
    
    import "fmt"
    
    func main() {
    
    	ch := make(chan string)
    
    	go func(ch chan string) {
    		for i := 0; i < 10; i++ {
    			ch <- fmt.Sprintf("%d", i)
    		}
    
    	}(ch)
    
    	for i := 0; i < 10; i++ {
    		s := <- ch
    		fmt.Println(s)
    	}
    
    
    }
    
  • 相关阅读:
    【23设计模式】总结
    【JAVA】内部类,内部接口
    【JAVA】接口
    【JAVA】抽象类,抽象方法
    【JAVA】类加载器
    【JAVA】枚举
    【JAVA】序列化
    【JAVA】异常笔记
    汇编笔记_第十一章
    汇编笔记_第十章
  • 原文地址:https://www.cnblogs.com/kayb/p/15325488.html
Copyright © 2011-2022 走看看