all goroutines are asleep的一次记录

func testDeadLock(c chan int) {
	for {
		fmt.Println(<-c)
	}
}

func main() {
	c := make(chan int)
	c <- 'A'
	go testDeadLock(c)
	time.Sleep(time.Millisecond)
}

上面的代码会产生fatal error: all goroutines are asleep - deadlock!的错误提示

func testDeadLock(c chan int) {
	for {
		fmt.Println(<-c)
	}
}

func main() {
	c := make(chan int)
	go testDeadLock(c)
	c <- 'A'
	time.Sleep(time.Millisecond)
}

而这份代码则会正常的输出65,造成上面不同的原因是我们声明了一个无缓冲的channel,所以当对这个channel写的时候,会一直阻塞等到某个协程对这个channel读,但是我们的程序在写的时候就阻塞了不会执行到下面的读操作,于是程序发生了死锁。

猜你喜欢

转载自blog.csdn.net/coffiasd/article/details/114265155
ALL