查看: 1235| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 多線程 blocking queue

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
https://paste.ubuntu.com/p/cWsFNYcGpQ/
先寫了MyQueue1 用一個condition
consumer thread透過condition判斷que empty ,就wait, release lock
producer thread透過同一個condition 取得lock, 放東西到que, and notify consumer

但是看了python and java source code
都是用兩個condition (not_empty / not_full)
為什麼要這麼做呢?我的作法應該也行得通,難道是效率問題?
看不透,請大家解疑,感謝

上一篇:犹豫是否继续要刷下去。。。。。
下一篇:482. License Key Formatting C# o(n) 无法通过,求优化
🔗
yuqinlear 2019-4-26 08:34:35 | 只看该作者
全局:
我认为主要是性能。 楼主的一个条件的情况中 self.condition.notify() 应该改成notifyAll, 不然可能被同种等待条件的线程占有后失效。  然后降低notifyAll开销的办法就是分开为两个条件。
回复

使用道具 举报

🔗
 楼主| sean72kimo 2019-4-26 09:03:00 | 只看该作者
全局:
yuqinlear 发表于 2019-4-26 08:34
我认为主要是性能。 楼主的一个条件的情况中 self.condition.notify() 应该改成notifyAll, 不然可能被同种 ...

可以解釋一下為什麼是性能嗎?為什麼用兩個condition (not_full & not_empty)
我也猜測是性能,但實在想不是很清楚。
兩個condition是怎麼運作的?

Python source code 裡面這樣寫道
https://paste.ubuntu.com/p/5P3dZ35yt4/
```
        # Notify not_empty whenever an item is added to the queue; a
        # thread waiting to get is notified then.
        self.not_empty = threading.Condition(self.mutex)

        # Notify not_full whenever an item is removed from the queue;
        # a thread waiting to put is notified then.
        self.not_full = threading.Condition(self.mutex)
```
回复

使用道具 举报

🔗
yuqinlear 2019-4-26 09:44:59 | 只看该作者
全局:
sean72kimo 发表于 2019-4-26 09:03
可以解釋一下為什麼是性能嗎?為什麼用兩個condition (not_full & not_empty)
我也猜測是性能,但實在想 ...

只用一个条件的情况,所有线程被注册在一个管程中(抢一个话筒): 当empty()的时候consumer线程被阻塞,而producer在queue中放入元素后,notify唤醒的可能是另一个producer(因为这个是不可定的),进而producer产出遇到队列容量限制后阻塞造成死锁。  解决办法,使用notifyAll唤醒所有线程保障consumer进入打破僵局。 notifyAll需要唤醒所有线程,所有线程都要尝试进入critical section很可能再次被阻塞, 光看下这context switch就是个明显的开销。
引入两个条件后,producer,consumer分别被注册在不同管程(各自一个话筒), producer完事后唤醒单个consumer去获取其相应管程。
回复

使用道具 举报

🔗
 楼主| sean72kimo 2019-4-26 09:59:02 | 只看该作者
全局:
yuqinlear 发表于 2019-4-26 09:44
只用一个条件的情况,所有线程被注册在一个管程中(抢一个话筒): 当empty()的时候consumer线程被阻塞,而 ...

按照你描述的情況:
```
当empty()的时候consumer线程被阻塞,而producer在queue中放入元素后,notify唤醒的可能是另一个producer(因为这个是不可定的),
```
P1完事,喚醒了P2,但是P2會在 while loop檢查que是否滿了,發現滿了,回到condition.wait() 釋放鎖。
為什麼會死鎖呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表