多线程中static对象
#include<iostream>
classStaticInit{
public:
StaticInit(){
std::cout<<"Init Obj "<<std::endl;
}
staticStaticInit& getInstance(){
staticStaticInit i;
return i;
}
void testfun(){
std::cout<<"test ---fun"<<std::endl;
}
};
staticStaticInit instance;
int main(){
std::cout<<"pr----"<<std::endl;
instance.testfun();
getInstance();
}
如上面代码,对于单个线程来说,是安全的。
但是对于多线程就不好说了,主要是涉及到static对象初使化的问题。也就是C++中这些static对象和变量是何时初使化的。
先给出结论:
先给出结论:
全局变量和文件域的静态变量都将在main开始之前被初始化;只有函数内的局部静态变量才是在第一次使用才初始化的,而且不是线程安全的。静态变量有可能初始化多次
静态对象初使化的验证可以用上面的例子来说明,先
g++-ggdb test.cpp
然后运行的时候,在第7行代码打上断点,也就是在构造函数里面打上断点。看程序在执行到第24和25行的时候有没有跳到第7行去
执行这个对象的初使化。
推荐阅读: