2011-06-12 173 views
15

我知道這個問題可能看起來像是重複的,但我還沒有得到答案,讀取其他問題。C++多線程安全局部變量?

我的情況 - 從express edition studio + Windows sdk開始的Visual C++編譯器2005。

只是如果這樣的一個功能問題:

void myFunc() 
{ 
    int i=0; 
    i++; 
} 

安全地從多個線程調用?

是的,它似乎是這樣,但編譯器會不會讓我的變量在內存中是靜態的?那麼這可能會導致兩個線程在一個內存區域上一起工作?或者我的恐懼只是一些愚蠢的恐懼?所有的局部變量都是在調用函數的時候創建的?

回答

23

是的,它是線程安全的。

i在內存中不會是靜態的,因爲它不是靜態的。如果,另一方面,你這樣寫:

void myFunc() 
{ 
    static int i = 0; 
    i++; 
} 

那就不是線程安全的(當然,如果i實際使用)。

局部變量都位於堆棧上(或完全在寄存器中生存)。每個線程都有自己的堆棧,並且寄存器的處理方式使它們基本上位於每個線程的本地(請參閱Context Switching),因此您沒有問題。

+0

謝謝Peter Alexander! – Evengard 2011-06-13 14:58:19

5

編譯器無法使您的變量變爲靜態的,因爲這會改變程序的語義。只要你堅持只在你的棧中聲明的變量,那麼你可以保證線程安全。

1

@PeterAlexander可能回答了你擔心的情況,但另一個不安全的情況是如果i是一個全局變量。

7

並且所有局部變量都是在調用該函數的時刻創建的?

本地變量的典型實現是在堆棧上創建它們,並且每個線程都有自己的堆棧,所以本地人很好。

唯一需要注意的是當變量是一個複雜類型時,因爲它可能具有對靜態數據或全局數據進行操作的邏輯。當然,大多數優秀的軟件都會避免像這樣寫類。