多线程中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行去
执行这个对象的初使化。
推荐阅读:
浙公网安备 33010602011771号