请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师你好,goroutine的问题

https://img1.sycdn.imooc.com//szimg/5b1684c50001fc9306160222.jpg老师这里的node一直送数据,没有人收,为什么放到go func(){}就不会deadlock,单独就会出现deadlock呢?

正在回答 回答被采纳积分+3

3回答

ccmouse 2018-06-11 21:03:39

非常抱歉可能当时那两天正好忙了一下没看到,然后问题有了回答以后,反而不出现在待解答里面了。

这里呢,首先假设我们收到返回值的人会从out里面不断收数据。但是如果不使用go func的话,out<-node这行就会等人收,但此时函数还没有返回,外面从out收数据的代码还没执行到,形成了死锁。

那么这里有了go func。go func这一大段只是开了一个goroutine“并行”执行,而TraverseWithChannel立刻返回,那么外面收数据的代码就被执行到,这个channel的路就通了。

1 回复 有任何疑惑可以回复我~
  • 提问者 鱼右 #1
    老师你好,如果不加go func 会死锁,这个我可以理解到,我有点不懂的是,如果加了go func 那么主函数就通了,我看了一下这里没有close就会死锁,这是为什么呢?如果我没有接受者,这个go func 里面会不会有人送这个chan呢?如果有人送,它没有人收会不会deadlock呢?  最后一问,协程如果被阻塞会不会出现deadlock,多谢老师
    回复 有任何疑惑可以回复我~ 2018-06-12 09:06:48
  • ccmouse 回复 提问者 鱼右 #2
    您似乎对死锁的概念有误。如果不加go fun,这个是死锁。在这种情况下,发的人发不出去在等人收,收的人收不到在等人发,这种互相等待却解不了的情况,才是死锁。
    那么我们看主函数通了,但是没有close。goroutine现在的状态不是死锁,是阻塞,在等待别人收数据。虽然再也没有人去收数据,但此时主函数一直在运行,如果主函数想收数据,随时都可以。这个和上面的死锁解不开是不一样的。
    嗯,所以就是说阻塞不要紧,是正常的,只要有channel就总有一方要阻塞。要互相把对方阻塞住才是死锁,死锁由于解不开,是要避免的。
    回复 有任何疑惑可以回复我~ 2018-06-12 22:06:29
  • 提问者 鱼右 回复 ccmouse #3
    回复 ccmouse好的 ,多谢老师,!!!
    回复 有任何疑惑可以回复我~ 2018-06-12 22:19:55
提问者 鱼右 2018-06-11 17:31:42

老师 在嘛 马上一周了 囧


0 回复 有任何疑惑可以回复我~
提问者 鱼右 2018-06-07 08:23:23

老师看到以后 ,可以回答一下嘛 多谢

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信