作者sean72 (.)
看板Python
标题Re: [问题] blocking queue 实作
时间Sat Jul 21 17:25:43 2018
谢谢帮忙review
: 推 flarehunter: 在空的时候同时有2个get()和1个put()可能会坏掉 07/20 23:30
: → flarehunter: 有两个MyQueue物件也会坏掉 另外为什麽要继承Thread? 07/20 23:31
https://paste.ubuntu.com/p/Zjh3y6ychm/
抄了source code,改成这样
Consumer1先跑,取得了self.not_empty,并且因为que == 0
所以等在while loop里 (wait())
Consumer2接着跑,此时C2能取得self.not_empty lock吗?
他是怎麽进入等待的?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 172.89.32.145
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1532165146.A.897.html
1F:推 flarehunter: wait会释放lock 所以别人才能拿lock再notify 07/21 18:11
3F:推 cutekid: 好奇原来的code在empty时,遇到两个get一个put为什麽会坏 07/21 19:59
4F:推 flarehunter: 因为他用if不是while 07/21 21:19
5F:推 cutekid: 嗯,我用if的状况去分析,还是看不出会出问题 07/22 08:54
6F:→ cutekid: sean72大大,你有看出问题吗 07/22 08:55
原来的code 只用了一个lock
https://paste.ubuntu.com/p/dkqbMs8NKS/
先来两个get,两个都会卡在 wait
put, 然後会notify其中一个get 然後进行
此get完毕之後,又送了 notify给另外一个正在wait的get
2nd get醒来之後,因为是if语句,所以没有继续检查que empty
直接执行popleft 所以出错
※ 编辑: sean72 (172.89.32.145), 07/22/2018 10:22:10
7F:推 cutekid: 了解了,谢谢 s 大还有 f 大 07/22 10:44