多核心與同步
在C語言中,僅對執行緒之間傳遞的旗標變數加上volatile,仍不足以作為同步,其理由下列何者正確?
- A因為加了volatile的變數,其他執行緒就無法讀取
- B因為volatile只是抑制編譯器的最佳化,並不保證操作的不可分割性,也不保證其他核心看到的順序
- C因為加上volatile後,變數會被存到磁碟而變慢
查看答案與解析
正確答案:B. 因為volatile只是抑制編譯器的最佳化,並不保證操作的不可分割性,也不保證其他核心看到的順序
volatile是指示編譯器不要省略或合併變數的讀寫,原本是為了硬體暫存器的操作而設計的。它無法防止CPU調換記憶體操作的順序,也不會讓counter++這類操作變得不可分割。C11與C++11以後,只要使用_Atomic或std::atomic,就能同時保證不可分割性與記憶體順序。
- A. 其他執行緒也可以讀取。
- B. 正確。執行緒之間的同步應使用原子變數。
- C. 不會被存到磁碟。