deadlock时为啥未打印大写字符

来源:11-2 使用Channel等待任务结束

扎西笑嘻嘻

2020-04-20

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

写回答

1回答

扎西笑嘻嘻

提问者

2020-04-21

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

0
3
Yao_Jerry
回复
qq_蒙牛_0
你说的是对的
2020-12-27
共3条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程