请稍等 ...
×

采纳答案成功!

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

deadlock时为啥未打印大写字符

老师,你好。我有一个问题是这样的:在两个for循环后读取done的时候为什么没有打一个大写字符?我的理解是deadlock应该发生第一次往chan int输入大写字符时的w.done <- true的语句处,而此时应该是要输出一个大写字符后才deadlock?

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

1回答

提问者 扎西笑嘻嘻 2020-04-21 15:54:48

老师,您好,我又看了一下,有了点自己的理解:我们在第一个写入小a的循环中给10个协程的每个channel写了一个字符,在doWork协程中取出了这10个字符并且又回写了done标志,到第二个写入大A的循环中,由于此时主协程还未拿到回写的10个done标志(拿回写done标志的代码在后面的for循环中),因此此时进入大A循环时,由于done标志还未读走,所以10个协程还未执行完上一次的作业(也即此时协程未在等待chan中数据的"初始阻塞位置"),因此导致大A循环要进入上一次未结束作业的协程中,因此导致deadlock,因此也不会执行协程中的任何语句(不会打印大写字符)。这种理解是对的不?

0 回复 有任何疑惑可以回复我~
  • 你开头理解的对,但是大A那段解说是不对的,并不是什么大A循环要进入上一次未结束作业的协程中。
    
    在done <- true那一行卡住了,等着有人来接收这个true (这个你已经自己弄明白了)
    同样的道理,大A写进了in,等着有人来接收这个A,但是没人接收,all goroutines are asleep - deadlock!
    
    往管道里送东西而已,怎么能想到要进入未完成作业的协程呢?你想多了
    回复 有任何疑惑可以回复我~ 2020-07-07 14:45:17
  • 我觉得不是这样的吧?大A写进了in,但是协程里面已经在对这个in进行遍历了,也就是说有人去接收这个A,但实际上还是报错了,是不是因为这个协程之前已经在<- done这里被阻塞了的原因呢?这个问题没想明白
    回复 有任何疑惑可以回复我~ 2020-12-27 19:32:20
  • 你说的是对的
    回复 有任何疑惑可以回复我~ 2020-12-27 19:49:06
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信