问答 / 0 / 5 / 创建于 6年前
func main() { ch := make(chan int) go func() { ch <- 1 ch <- 2 }() time.Sleep(time.Second) }
应该是goroutine死锁了,但main退出了,所以goroutine也退出了, 如果写在main中就死锁了,
ch := make(chan int) go func() { ch <- 1 ch <- 2 }() ch <- 2 time.Sleep(time.Second)
或者你在goroutine中println,打印不出,说明其内部也是死锁的
ch := make(chan int) go func() { ch <- 1 ch <- 2 println("11111") }() time.Sleep(time.Second)
上面代码goroutine 内部阻塞了,但是主goroutine没有阻塞所以没死锁。所有用户级goroutine阻塞才会死锁。 阻塞是死锁的必要条件,但不充分。
@wish 查了一下资料基本是这个意思,因为channel只有一端,所以没有正确执行,main退出后goroutines也退出了,所以没有显示出deadlock
func main() { ch := make(chan int) go func() { ch <- 1 ch <- 2 }() ch <- 2 time.Sleep(time.Second) } // fatal error: all goroutines are asleep - deadlock!
@yourself 是的,死锁,是指在程序的主线程中发生的情况,如果情况发生在非主线程中,读取或者写入的情况是发生堵塞的,而不是死锁。实际上,阻塞情况省去了我们加锁的步骤,反而是更加有利于代码编写,要合理的利用阻塞。 参见:https://blog.csdn.net/qq_30505673/article/...
@wish 感谢分享
我要举报该,理由是:
应该是goroutine死锁了,但main退出了,所以goroutine也退出了,
如果写在main中就死锁了,
或者你在goroutine中println,打印不出,说明其内部也是死锁的
上面代码goroutine 内部阻塞了,但是主goroutine没有阻塞所以没死锁。所有用户级goroutine阻塞才会死锁。
阻塞是死锁的必要条件,但不充分。
@wish 查了一下资料基本是这个意思,因为channel只有一端,所以没有正确执行,main退出后goroutines也退出了,所以没有显示出deadlock
@yourself 是的,死锁,是指在程序的主线程中发生的情况,如果情况发生在非主线程中,读取或者写入的情况是发生堵塞的,而不是死锁。实际上,阻塞情况省去了我们加锁的步骤,反而是更加有利于代码编写,要合理的利用阻塞。
参见:https://blog.csdn.net/qq_30505673/article/...
@wish 感谢分享