我知道这个问题可能看似重复,但我没有得到解答其他问题的答案。
我的情况 - 来自Express edition studio + Windows sdk的Visual C ++编译器2005。
这是一个类似函数的问题:
void myFunc()
{
int i=0;
i++;
}
从多个线程调用是否安全?
是的,它似乎是,但编译器不会让i变量在内存中是静态的吗?那么这可能会导致两个线程在一个内存区域上共同作用?或者我的恐惧只是一些傻瓜的恐惧?所有局部变量都是在调用函数时创建的?
答案 0 :(得分:23)
是的,它是线程安全的。
i
在内存中不会是静态的,因为它不是静态的。另一方面,如果你写了:
void myFunc()
{
static int i = 0;
i++;
}
然后它不是线程安全的(好吧,如果实际使用了i
)。
局部变量都位于堆栈中(或完全位于寄存器中)。每个线程都有自己的堆栈,并且寄存器的处理方式使它们基本上是每个线程的本地(参见Context Switching),所以你没事。
答案 1 :(得分:7)
所有局部变量都是在调用函数时创建的?
局部变量的典型实现是在堆栈上创建它们,每个线程都有自己的堆栈,所以本地变量很好。
唯一需要注意的是变量是复杂类型,因为它可能在其中具有对静态数据或全局数据进行操作的逻辑。当然,大多数优秀的软件都会避免写这样的课程。
答案 2 :(得分:5)
编译器无法使变量成为静态变量,因为这会改变程序的语义。只要你坚持只在你的堆栈上声明的变量,那么你可以保证线程安全。
答案 3 :(得分:1)
@PeterAlexander可能已经回答了你担心的情况,但另一个不安全的情况是i
是全局变量。