C++多线程安全局部变量
C++ multithread safe local variables?
我知道这个问题可能看起来是重复的,但我在阅读其他问题时还没有得到答案。
我的处境-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
是全局变量。
相关文章:
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 为什么静态局部变量的 MSVC 线程安全初始化使用 TLS
- 使用局部静态std :: ARNE_FLAG和局部静态指针对静态变量的线程安全初始化
- 单个变量的线程安全
- 如何在不使用的情况下在 <mutex>C++11 中实现多线程安全单例
- 线程安全局部变量
- 如何在 C++03 中实现线程安全的局部静态变量
- C++中原子变量的线程安全初始化
- 为什么映射在C++中不是多线程安全的
- 静态局部变量的线程安全增量
- G++ 4.6 -std=gnu++0x:静态局部变量构造函数调用计时和线程安全
- 标准容器作为多线程应用程序中的局部变量
- 在VS2015中c++局部静态变量初始化线程安全吗?
- 多线程环境中的静态局部变量初始化
- clang++是否对局部静态变量进行线程安全初始化?
- C++多线程安全局部变量
- C++ 编译器如何保证常量成员变量的线程安全