簡體   English   中英

如果條件變量發出信號到鎖定的線程怎么辦?

[英]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)時,必須使用相同的互斥鎖。 否則,這可能發生:

  1. out()線程測試isEmpty ,發現它是真的;
  2. in()線程將isEmpty設置為false並發出條件變量的信號(但是沒有人醒來,因為沒有人在等待);
  3. out()線程調用cond.wait()並永遠阻塞,盡管隊列不再是空的。

請注意,在這個序列中沒有一個虛假的喚醒 - 它只是一個普通的老競爭條件。

只要您使用與測試isEmpty時相同的互斥鎖更新isEmpty ,就不會發生此交錯。

那么如果cond向鎖定的線程發出信號會發生什么?

信號永遠消失。 如果沒有線程正在等待當信號pthread_cond_signal被調用,然后pthread_cond_signal什么也不做。

由於isEmpty正被兩個不同的線程讀取和修改,因此在不受保護的情況下訪問它是錯誤的。 這主要是當你允許你在做什么, inout用不同的鎖實例。

在相同的條件變量上使用不同的鎖實例違反pthread_cond_wait()POSIX API (強調我的)。

在同一條件變量上 使用多個互斥鎖對並發pthread_cond_wait()pthread_cond_timedwait() 操作的影響是未定義的 ; 也就是說,當線程等待條件變量時,條件變量將綁定到唯一的互斥鎖,並且當等待返回時,此(動態)綁定結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM