多核心與同步

以條件變數(condition variable)「等到佇列不為空」時,被喚醒後之所以用while敘述而非if敘述重新確認條件,其理由下列何者正確?

  1. A因為while敘述比if敘述執行得更快
  2. B因為規定if敘述不能使用條件變數
  3. C因為即使被喚醒,也可能被其他執行緒搶先取走,或無緣無故醒來,導致條件並未滿足
查看答案與解析

正確答案:C. 因為即使被喚醒,也可能被其他執行緒搶先取走,或無緣無故醒來,導致條件並未滿足

條件變數的等待,是先放開鎖並休眠,收到通知醒來後再重新取得鎖才返回。然而在醒來之前,其他執行緒可能先取得鎖並取走佇列的元素。此外,因實作上的考量,也允許在沒有通知的情況下醒來(虛假喚醒,spurious wakeup)。因此,醒來後要確認條件,若不滿足就再次等待,所以要寫成while敘述。

  • A. 這不是速度的問題。
  • B. 沒有這樣的規定。
  • C. 正確。醒來後必須重新確認條件。
練習這個領域 前往領域頁面

多核心與同步的其他題目

  1. 兩個核心各自的快取中都有變數x的副本。核心0寫入x之後,核心1讀取x時,若沒有快取一致性(cache coherency)機制,可能發生下列何種問題?
  2. 快取一致性協定MESI的四種狀態,下列哪一組是正確的?
  3. 在MESI協定中,快取列處於Modified(M)狀態時,其意義下列何者正確?
  4. 在MESI協定中,核心對處於Exclusive(E)狀態的快取列寫入時,其動作下列何者正確?
  5. 在無效化型的一致性協定中,核心對處於Shared(S)狀態的快取列寫入時,會進行下列何種動作?

這個領域的比較