多核心與同步

關於原子指令CAS(比較並交換,compare-and-swap)的動作,下列何者正確?

  1. A只有在記憶體的值等於預期值時才寫入新值,並可得知是否成功
  2. B比較兩個記憶體的值,把較大的值寫入兩者
  3. C無條件地交換記憶體的值與暫存器的值
查看答案與解析

正確答案:A. 只有在記憶體的值等於預期值時才寫入新值,並可得知是否成功

CAS不可分割地執行「若此位址的值仍是預期值,就改為新值」。若在讀取到寫入之間,其他執行緒已改變了值,就會失敗,所以能在確認未被更動的情況下進行更新。失敗時只要重新讀取、計算並重做CAS,形成迴圈,就能在不使用鎖的情況下安全地更新共用的值。x86的cmpxchg指令等便屬於此類。

  • A. 正確。比較後若相等就進行交換。
  • B. 這不是寫入較大值的指令。
  • C. 無條件的交換是交換(swap)指令。
練習這個領域 前往領域頁面

多核心與同步的其他題目

  1. 上方的程式碼使用CAS(&p, 預期值, 新值)將共用變數counter變成2倍。CAS失敗而重做迴圈,是在什麼情況下?
  2. 在RISC-V的LR/SC(載入保留/條件式儲存)這類指令組中,SC(條件式儲存)會在什麼情況下失敗?
  3. 關於使用CAS的無鎖資料結構中會出現的ABA問題,下列說明何者正確?
  4. 關於RISC-V的amoadd.w指令或x86的lock xadd指令這類取得並相加(fetch-and-add)指令的動作,下列何者正確?
  5. 關於自旋鎖(spinlock),下列說明何者正確?

這個領域的比較