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

C++ multithread safe local variables?

本文关键字:局部变量 多线程安全 C++      更新时间:2023-10-16

我知道这个问题可能看起来是重复的,但我在阅读其他问题时还没有得到答案。

我的处境-Visual C++编译器2005来自express edition studio+Windows sdk。

只是一个问题,如果一个函数是这样的:

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

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

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

是的,它是线程安全的。

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

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

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

局部变量都位于堆栈上(或者完全位于寄存器中)。每个线程都有自己的堆栈,寄存器的处理方式基本上是每个线程的本地寄存器(请参阅上下文切换),所以您可以。

所有的局部变量都是在调用函数的那一刻创建的吗?

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

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

编译器不能使变量成为静态变量,因为这会更改程序的语义。只要您坚持使用仅在堆栈上声明的变量,就可以保证线程安全。

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