2011-06-12 138 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

并且所有局部变量都是在调用该函数的时刻创建的?

本地变量的典型实现是在堆栈上创建它们,并且每个线程都有自己的堆栈,所以本地人很好。

唯一需要注意的是当变量是一个复杂类型时,因为它可能具有对静态数据或全局数据进行操作的逻辑。当然,大多数优秀的软件都会避免像这样写类。