[英]Declaratiaion of a variable shared between threads
相當常見的面試問題:如何在C ++中聲明一個由不同線程使用的變量? (或類似的東西)。 我以為'volatile int x;' 是答案,但我從一些評論中看到這是不正確的。 我對兩者都感興趣:
什么是正確的答案
std::atomic<int> x;
為什么volatile在過去被認為是正確的(?)而不是現在
根據C ++標准,它永遠不會正確。 在C ++ 11之前,標准根本沒有提到線程; C ++ 11通過添加原子類型(和std::mutex
等原語)來支持同步,而不是通過更改volatile
或其他現有語言功能的含義。
一個流行的編譯器決定volatile
應該導致跨線程同步訪問,以及它的標准含義。 其他編譯器不提供該擴展,因此它不是您可以依賴的東西。
volatile
從來都不是這個問題的正確答案。 volatile
關鍵字向編譯器提供指示,該變量可能在兩次使用之間發生變化。 因此,雖然多線程應用程序可以執行此操作,但其他情況也是如此,例如微控制器上的端口映射變量。
重要的是,編譯器不會保護對變量的訪問,而只是避免任何假設變量在訪問之間保持相同的優化。
出於您的目的, std::atomic<Type>
是一個更好的答案,盡管在面試情況下可能更好地理解重要因素是線程間訪問由鎖定控制器控制,防止同時讀/寫或寫入/寫入不同的線程訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.