簡體   English   中英

C#和C中揮發性的差異

[英]Difference in volatile in C# and C

c#和c中volatile的區別是什么? 我在一次采訪中被問到這個問題。

Herb Sutter 在這篇博客文章中提到的文章簡明扼要地解釋了這些內容,並比較了C,C ++,Java和C#中volatile的用法和含義。

在這個網站上還有一些很好的問題和答案:

編輯:不要混淆任何人這里是初始鏈接中提到的DDJ文章的“ 確切鏈接 ”(這是鏈接到Herb Sutter的博客)。

此外,Nigel Jones 撰寫的這篇文章解釋了嵌入式C編程環境中的volatile關鍵字。 由於這個問題似乎在采訪中突然出現,同一作者的另一篇文章是我的最愛之一(“ 確切鏈接 ”),並且對C世界中的易變性有另一個很好的解釋。

在C volatile中告訴編譯器不要優化對變量的訪問:

int running = 1;
void run() {
    while (running) {
        // Do something, but 'running' is not used at all within the loop.
    }
}

通常,編譯器可能會將“while(running)”轉換為“while(1)”。 當'running'變量標記為volatile時,編譯器每次都被強制檢查變量。

重要的是要理解,對於C'volatile'僅限制編譯器進行優化,而您的硬件(即CPU緩存,指令管道等)可能仍會重新排序內存訪問。 您的C編譯器無法告訴您的硬件不進行優化。 你必須自己做(例如使用內存屏障)。

據我所知(但我不完全確定)C#規范更進一步:

  • 如果寫入volatile變量,則保證在完成之前執行的所有內存訪問。
  • 如果從易失性變量中讀取,則可以保證在完成易失性變量讀取之前,您完成的所有內存訪問都沒有完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM