C ++多线程安全局部变量?

时间:2011-06-12 22:04:02

标签: c++ multithreading

我知道这个问题可能看似重复,但我没有得到解答其他问题的答案。

我的情况 - 来自Express edition studio + Windows sdk的Visual C ++编译器2005。

这是一个类似函数的问题:

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

从多个线程调用是否安全?

是的,它似乎是,但编译器不会让i变量在内存中是静态的吗?那么这可能会导致两个线程在一个内存区域上共同作用?或者我的恐惧只是一些傻瓜的恐惧?所有局部变量都是在调用函数时创建的?

4 个答案:

答案 0 :(得分:23)

是的,它是线程安全的。

i在内存中不会是静态的,因为它不是静态的。另一方面,如果你写了:

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

然后它不是线程安全的(好吧,如果实际使用了i)。

局部变量都位于堆栈中(或完全位于寄存器中)。每个线程都有自己的堆栈,并且寄存器的处理方式使它们基本上是每个线程的本地(参见Context Switching),所以你没事。

答案 1 :(得分:7)

  

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

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

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

答案 2 :(得分:5)

编译器无法使变量成为静态变量,因为这会改变程序的语义。只要你坚持只在你的堆栈上声明的变量,那么你可以保证线程安全。

答案 3 :(得分:1)

@PeterAlexander可能已经回答了你担心的情况,但另一个不安全的情况是i是全局变量。