多线程中static对象

  1. #include<iostream>
  2. classStaticInit{
  3. public:
  4. StaticInit(){
  5. std::cout<<"Init Obj "<<std::endl;
  6. }
  7. staticStaticInit& getInstance(){
  8. staticStaticInit i;
  9. return i;
  10. }
  11. void testfun(){
  12. std::cout<<"test ---fun"<<std::endl;
  13. }
  14. };
  15. staticStaticInit instance;
  16. int main(){
  17. std::cout<<"pr----"<<std::endl;
  18. instance.testfun();
  19. getInstance();
  20. }
如上面代码,对于单个线程来说,是安全的。
但是对于多线程就不好说了,主要是涉及到static对象初使化的问题。也就是C++中这些static对象和变量是何时初使化的。
先给出结论:
    全局变量和文件域的静态变量都将在main开始之前被初始化;只有函数内的局部静态变量才是在第一次使用才初始化的,而且不是线程安全的。静态变量有可能初始化多次

静态对象初使化的验证可以用上面的例子来说明,先
  1. g++-ggdb test.cpp
然后运行的时候,在第7行代码打上断点,也就是在构造函数里面打上断点。看程序在执行到第24和25行的时候有没有跳到第7行去
执行这个对象的初使化。

 
推荐阅读:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 





原文地址:https://www.cnblogs.com/yml435/p/6386154.html