2010-09-14 59 views
3

InterlockedIncrement和其他互鎖操作將其參數聲明爲volatile。爲什麼?這是什麼意圖和影響?聲明爲volatile的InterlockedIncrement參數有什麼影響

+0

我對這個http://groups.google.com/group/comp.programming.threads/tree/browse_frm/thread/1fa4a82dda916b18/a886def5998f9b82?rnum=21&_done=%2Fgroup%2Fcomp.programming發現了激烈的爭論。線程%2Fbrowse_frm%2Fthread%2F1fa4a82dda916b18%2Ffd6be8f0b18bd62d%3F#doc_5d933de5ad5378cf - 在那裏沒有結論,但有詳細的解釋,爲什麼揮發性不會做什麼人會一見鍾情。 – Suma 2010-09-14 11:18:05

+0

你可能也想看看[這個問題]的答案(http://stackoverflow.com/questions/3604569/what-kinds-of-optimizations-does-volatile-prevent-in-c)。 – sbi 2010-09-14 13:10:29

回答

8

可能的影響是非常小的。最可能的意圖是允許用戶將volatile限定變量傳遞給這些函數,而不需要類型轉換。

-1

volatile變量阻止編譯器進行優化,阻止讀取到內存。只要代碼的可見效果相同,編譯器就可以進行任何優化,但這些效果在多個線程方案中並不考慮,只能從單個線程中考慮。 volatile關鍵字告訴編譯器,這個變量可能會被修改或從外部不可知的源中讀取,編譯器無法擺脫它或者內存訪問它。

+1

關於易失性一般而言,這是正確的,但這不適用於這種特殊情況。對於函數的調用者,如果函數將內部參數作爲volatile進行處理,則沒有區別。 – Suma 2010-09-14 11:10:46

+0

因爲被調用者從不需要編譯他們的代碼。 – Puppy 2010-09-14 12:41:31

-2

總之,易變意味着「這個變量可能會在此程序之外被修改」。

更多的話來說,這意味着變量的值可以在代碼中沒有任何相關指令的情況下更改。例如,它常用於低級I/O,其中寄存器或緩衝區的值可由硬件設置。

+1

在這種情況下似乎不適用。編譯器不編譯InterlockedIncrement函數,並且將該變量標記爲volatile在函數外部沒有任何作用。 – Suma 2010-09-14 11:11:44

+0

對不起,我在閱讀你的問題時一定跳過了一點。 – jv42 2010-09-14 11:13:26

+0

這與告訴編譯器不要優化對變量的訪問有關,即使在函數內部也是如此。我不確定爲什麼它需要在原型中,除了告訴你如何處理參數。 – jv42 2010-09-14 11:16:10

3

這樣做是爲了可以在正常變量和易失性變量上調用該函數。你不能將一個volatile變量傳遞給一個不期待volatile參數的函數。下面的代碼無法編譯(與Visual Studio 2005 C++編譯器進行測試):

void TestV(int *a) 
{ 
    *a = 1; 
} 

void Test() 
{ 
    volatile int a = 0; 
    TestV(&a); 
} 

該宣言是它是什麼,你可以做以下操作:

volatile LONG a = 0; 

InterlockedIncrement(&a); 

因爲它最有可能有一個感覺要在volatile變量上調用InterlockedIncrement,將它聲明爲這樣似乎是明智的。

相關問題