C++多线程安全局部变量?
问题描述:
我知道这个问题可能看起来像是重复的,但我还没有得到答案,读取其他问题。C++多线程安全局部变量?
我的情况 - 从express edition studio + Windows sdk开始的Visual C++编译器2005。
只是如果这样的一个功能问题:
void myFunc()
{
int i=0;
i++;
}
安全地从多个线程调用?
是的,它似乎是这样,但编译器会不会让我的变量在内存中是静态的?那么这可能会导致两个线程在一个内存区域上一起工作?或者我的恐惧只是一些愚蠢的恐惧?所有的局部变量都是在调用函数的时候创建的?
答
是的,它是线程安全的。
i
在内存中不会是静态的,因为它不是静态的。如果,另一方面,你这样写:
void myFunc()
{
static int i = 0;
i++;
}
那就不是线程安全的(当然,如果i
实际使用)。
局部变量都位于堆栈上(或完全在寄存器中生存)。每个线程都有自己的堆栈,并且寄存器的处理方式使它们基本上位于每个线程的本地(请参阅Context Switching),因此您没有问题。
答
编译器无法使您的变量变为静态的,因为这会改变程序的语义。只要你坚持只在你的栈中声明的变量,那么你可以保证线程安全。
答
@PeterAlexander可能回答了你担心的情况,但另一个不安全的情况是如果i
是一个全局变量。
答
并且所有局部变量都是在调用该函数的时刻创建的?
本地变量的典型实现是在堆栈上创建它们,并且每个线程都有自己的堆栈,所以本地人很好。
唯一需要注意的是当变量是一个复杂类型时,因为它可能具有对静态数据或全局数据进行操作的逻辑。当然,大多数优秀的软件都会避免像这样写类。
谢谢Peter Alexander! – Evengard 2011-06-13 14:58:19