golang all goroutines are asleep - deadlock

问题:

今天在写golang程序的时候,出现了一个错误:all goroutines are asleep - deadlock!
代码如下:

package main

import (
	"fmt"
	"time"
)

func main() {
	in := make(chan string)
	in <- "hello"
	result := <-in
	fmt.Println(result)
	time.Sleep(time.Millisecond)
}

新建了一个信道,将hello 放入信道,然后从信道中取出,但是程序报错死锁,查阅资料,make 如果后面不加数字,则新建的是无缓冲信道,也就是信道只是用来流通数据,并不存储数据,接收一个数据,一定要将数据读取出去,不然就会发现阻塞,上述我们将hello放入in信道中,在main goroutines会阻塞main携程,知道有人将它从in信道中取出,由于没人取出,所以出现了死锁。

改进:

package main

import (
	"fmt"
	"time"
)

func main() {
	in := make(chan string)
	in <- "hello"
	go func() {
		result := <-in
		fmt.Println(result)
	}()
	time.Sleep(time.Millisecond)
}

我们将接收的信道新开一个goroutine 由于接收和发送的不在一个gorountine中,应该不会阻塞吧,但是还是与之前报错一模一样

再分析:

由于执行到```in<-"hello"的时候,阻塞了main协程,所以没有来得及开别的gorountine就发生了死锁:

二次改进:

package main

import (
	"fmt"
	"time"
)

func main() {
	in := make(chan string)
	go func() {
		result := <-in
		fmt.Println(result)
	}()
	in <- "hello"
	
	time.Sleep(time.Millisecond)
}

将新开的gorountine放在阻塞代码之前,这样就不会发生死锁,因为有两个协程在同时工作,一个发送,一个接收

你可能感兴趣的:(GoLang,gorountine,deadlock)