![](/img/trans.png)
[英]What happens if a pthread condition variable is signaled but the mutex is locked?
[英]What if a condition variable signals to a locked thread?
在下面的(偽)代碼中,無論出於何種原因, cond
可能會喚醒而不應該喚醒。 所以我在那里放了一個while循環。 當它確實喚醒時,它仍將消耗鎖,因此可以保證在out()
只有一個線程正在執行其工作。
但是,如果在out()
有一個虛假的喚醒,同時in()
向out()
發出信號,那么會發生什么呢?然而在那個時刻out()
已經因為虛假的喚醒而被鎖定。 那么如果cond
向鎖定的線程發出信號會發生什么?
in()
inLock.lock()
isEmpty = false
cond.signal()
inLock.unlock()
out()
outLock.lock()
while isEmpty
cond.wait(outLock)
isEmpty = true
outLock.unlock()
注意
好吧,為了100%安全,我知道我可以in()
和out()
使用單個互斥量,但是當輸入和輸出同時發生時,我使用的數據結構是100%安全的; 它是一種隊列。 而且我認為在填充一些新數據時阻止從隊列中讀出的任何內容都是性能上的妥協,反之亦然。
我確實考慮過使用信號量,但問題是,無論出於何種原因,許多C和C ++庫都沒有實現信號量。
當in()
線程設置isEmpty = false
並且out()
線程測試while (isEmpty)
時,必須使用相同的互斥鎖。 否則,這可能發生:
out()
線程測試isEmpty
,發現它是真的; in()
線程將isEmpty
設置為false並發出條件變量的信號(但是沒有人醒來,因為沒有人在等待); out()
線程調用cond.wait()
並永遠阻塞,盡管隊列不再是空的。 請注意,在這個序列中沒有一個虛假的喚醒 - 它只是一個普通的老競爭條件。
只要您使用與測試isEmpty
時相同的互斥鎖更新isEmpty
,就不會發生此交錯。
那么如果cond向鎖定的線程發出信號會發生什么?
信號永遠消失。 如果沒有線程正在等待當信號pthread_cond_signal
被調用,然后pthread_cond_signal
什么也不做。
由於isEmpty
正被兩個不同的線程讀取和修改,因此在不受保護的情況下訪問它是錯誤的。 這主要是當你允許你在做什么, in
和out
用不同的鎖實例。
在相同的條件變量上使用不同的鎖實例違反了pthread_cond_wait()
的POSIX API (強調我的)。
在同一條件變量上 使用多個互斥鎖對並發
pthread_cond_wait()
或pthread_cond_timedwait()
操作的影響是未定義的 ; 也就是說,當線程等待條件變量時,條件變量將綁定到唯一的互斥鎖,並且當等待返回時,此(動態)綁定結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.