[問題] thread-safe queue

作者: suhang (suhang)   2019-04-26 04:01:59
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)
為什麼要這麼做呢?我的作法應該也行得通,難道是效率問題?
看不透,請大家解疑,感謝
作者: benchen0812 (あBen)   2019-04-26 06:22:00
我不確定 但我覺得應該是你這樣每次wake get() put()同時被wake一次? 然後如果 2 condition get()->阿說錯 put()只需要notify get() 因為你在 len(que)>= cap: wait 的時候 只有當len(que)< cap 才會放出LOCK, 這時候你的len(que) = cap - 1. 然後你在que.append 這時len(que) = cap, 你只需要叫get(), 因為你叫put他只會繼續入睡(len(put) = cap)如果有錯請指正XD
作者: Yshuan (倚絃)   2019-04-26 08:30:00
size=1的時候, 2個thread去get, 一個卡wait, 一個過了condition相同, 過了的那個 nottify到 wait的那個, 然後?size=Full. Ta, Tb: put and wait. T1: get and sig(Ta).T2: put and acquire first then Ta, Tb, finally sig(Tb)Ta, Tb wait and put, size overflow.更正, 不需要T2. Ta wake and sig(Tb). 就炸了

Links booklink

Contact Us: admin [ a t ] ucptt.com