多核心與同步

將上方的兩個執行緒在不同的核心上同時執行(假設編譯器不進行重新排序)。下列哪一個結果在循序一致性下不會發生,但在x86等實際的CPU上可能發生?

// 一開始 x = 0, y = 0
// 執行緒1      // 執行緒2
x = 1;            y = 1;
r1 = y;           r2 = x;
  1. Ar1 = 1 且 r2 = 1
  2. Br1 = 0 且 r2 = 1
  3. Cr1 = 0 且 r2 = 0
查看答案與解析

正確答案:C. r1 = 0 且 r2 = 0

在循序一致性下,其中一方的寫入會最先進行,所以至少有一方的讀取應該會看到1。然而在實際的CPU上,x = 1會先進入核心的儲存緩衝區,在其他核心看得到之前,後面的讀取r1 = y就可以先從主記憶體或快取讀取值。若兩個核心都發生同樣的情形,雙方都會讀到0。要防止這種情形,需在寫入與讀取之間插入記憶體屏障。

  • A. 若兩邊的寫入都先完成,即使是循序一致性也會發生。
  • B. 若執行緒1先全部執行完,即使是循序一致性也會發生。
  • C. 正確。在寫入還停留於儲存緩衝區的期間,讀取就先行進行。
練習這個領域 前往領域頁面

多核心與同步的其他題目

  1. 關於x86的記憶體一致性模型(TSO,Total Store Order,全域儲存順序)的特徵,下列何者正確?
  2. 關於ARM或RISC-V(RVWMO)這類較弱的記憶體一致性模型,下列何者正確?
  3. 關於記憶體屏障(fence)指令的作用,下列何者正確?
  4. 在上方的程式碼中,執行緒1準備好data後以flag通知,執行緒2看到flag後讀取data。在弱記憶體一致性模型的CPU上,要讓執行緒2確實讀到42,下列何者是必要的做法?
  5. 關於具有取得(acquire)與釋放(release)意義的記憶體操作,下列何者正確?

這個領域的比較