多核心與同步
以條件變數(condition variable)「等到佇列不為空」時,被喚醒後之所以用while敘述而非if敘述重新確認條件,其理由下列何者正確?
- A因為while敘述比if敘述執行得更快
- B因為規定if敘述不能使用條件變數
- C因為即使被喚醒,也可能被其他執行緒搶先取走,或無緣無故醒來,導致條件並未滿足
查看答案與解析
正確答案:C. 因為即使被喚醒,也可能被其他執行緒搶先取走,或無緣無故醒來,導致條件並未滿足
條件變數的等待,是先放開鎖並休眠,收到通知醒來後再重新取得鎖才返回。然而在醒來之前,其他執行緒可能先取得鎖並取走佇列的元素。此外,因實作上的考量,也允許在沒有通知的情況下醒來(虛假喚醒,spurious wakeup)。因此,醒來後要確認條件,若不滿足就再次等待,所以要寫成while敘述。
- A. 這不是速度的問題。
- B. 沒有這樣的規定。
- C. 正確。醒來後必須重新確認條件。