多核心與同步

在C語言中,僅對執行緒之間傳遞的旗標變數加上volatile,仍不足以作為同步,其理由下列何者正確?

  1. A因為加了volatile的變數,其他執行緒就無法讀取
  2. B因為volatile只是抑制編譯器的最佳化,並不保證操作的不可分割性,也不保證其他核心看到的順序
  3. C因為加上volatile後,變數會被存到磁碟而變慢
查看答案與解析

正確答案:B. 因為volatile只是抑制編譯器的最佳化,並不保證操作的不可分割性,也不保證其他核心看到的順序

volatile是指示編譯器不要省略或合併變數的讀寫,原本是為了硬體暫存器的操作而設計的。它無法防止CPU調換記憶體操作的順序,也不會讓counter++這類操作變得不可分割。C11與C++11以後,只要使用_Atomic或std::atomic,就能同時保證不可分割性與記憶體順序。

  • A. 其他執行緒也可以讀取。
  • B. 正確。執行緒之間的同步應使用原子變數。
  • C. 不會被存到磁碟。
練習這個領域 前往領域頁面

多核心與同步的其他題目

  1. C11的_Atomic或C++11的std::atomic可以指定記憶體順序(memory order),其理由下列何者正確?
  2. 比較以一把鎖保護整個大型資料結構的「粗粒度鎖」,與以不同的鎖保護各個部分的「細粒度鎖」,下列說明何者正確?
  3. 關於無鎖(lock-free)演算法的性質,下列何者正確?
  4. 關於臨界區段(critical section),下列說明何者正確?
  5. 關於平行程式中使用的屏障同步(barrier synchronization),下列說明何者正確?

這個領域的比較