多核心與同步

關於RISC-V的amoadd.w指令或x86的lock xadd指令這類取得並相加(fetch-and-add)指令的動作,下列何者正確?

  1. A只讀取記憶體的值,加法在暫存器中進行
  2. B將兩個記憶體位址的值相加,寫入第三個位址
  3. C對記憶體的值不可分割地加上指定的數,並回傳相加前的值
查看答案與解析

正確答案:C. 對記憶體的值不可分割地加上指定的數,並回傳相加前的值

取得並相加將讀取、加法、寫入作為單一不可分割的操作執行,所以只用一個指令就能解決counter++的資料競爭。由於會回傳相加前的值,也可用於依序發放號碼牌之類的處理(例如為各執行緒分配不重複的編號)。相較於CAS的迴圈,不會有失敗與重做,所以在許多執行緒同時更新時較為有利。

  • A. 加法與對記憶體的寫入都是不可分割地進行。
  • B. 這不是記憶體之間的運算。
  • C. 正確。適合用於共用計數器。
練習這個領域 前往領域頁面

多核心與同步的其他題目

  1. 關於自旋鎖(spinlock),下列說明何者正確?
  2. 下列何者是最不適合使用自旋鎖的情境?
  3. 在自旋鎖中,不直接用原子指令去改寫鎖的變數,而是平時以一般的讀取等待鎖被釋放,只有看到鎖空出來時才使用原子指令(test-and-test-and-set),其理由下列何者正確?
  4. 比較互斥鎖(休眠等待的鎖)與自旋鎖,下列說明何者正確?
  5. 下列何者是死結(deadlock)的例子?

這個領域的比較