Re: [問題] thread-safe queue

作者: suhang (suhang)   2019-04-26 12:40:06
※ 引述《Yshuan (倚絃)》之銘言:
: que size已滿. 三個Thread.
: producer: Ta, Tb.
: consumer: T1.
: 0. producer都先啟動. 並且停在wait()
: 1. T1執行, 執行完後notify Ta.
: 2. Ta結束wait, 執行完後notify Tb
: 因為你的condition只有一個, 因此造成producer notify producer.
: 3. Tb結束wait. 執行並que overflow.
Tb結束wait之後,應該是執行 第二行的while loop檢查
檢查發現que full, 就接著執行第三行的wait(),繼續回去等待
你說的情況應該是第二行寫成if的情況才會發生吧?
1. with self.condition:
2. while len(self.que) == self.cap:
3. self.condition.wait()
thanks for helping me
作者: stucode   2019-04-26 15:33:00
這樣的話不會 overflow 可是會卡死,因為 Ta 的 notify已經被 Tb 吃掉了,但 Tb 什麼都沒做又繼續回去等待,且T1 也還在等 notify 來喚醒他。造成佇列中還有東西,可是所有 threads 都在睡的局面。

Links booklink

Contact Us: admin [ a t ] ucptt.com