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

Eve*_*ard 16 c++ multithreading

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

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

只是一个问题,如果这样的功能:

void myFunc()
{
    int i=0;
    i++;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*der 23

是的,它是线程安全的.

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

void myFunc()
{
    static int i = 0;
    i++;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Kyl*_*tan 7

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

局部变量的典型实现是在堆栈上创建它们,并且每个线程都有自己的堆栈,因此本地变量很好.

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


Pup*_*ppy 5

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