当前位置:   article > 正文

C++(11):局部静态变量是线程安全的_c++ 局部静态变量 线程安全

c++ 局部静态变量 线程安全

C++中单实例模式的一个简单的写法是:将对象定义为一个函数的局部静态变量,然后返回对象的引用,这样在函数首次调用时完成静态对象的初始化,但这一做法在C++11前并不是线程安全的,而C++11已经可以保证其线程安全性:

在当前线程执行到需要初始化静态变量时,如果有其他线程正在初始化该变量,则阻塞当前线程,直到初始化完成为止。

  1. #include <iostream>
  2. #include <thread>
  3. using namespace std;
  4. class A{
  5. public:
  6. A(int t)
  7. {
  8. cout<<"constructor A, thread:"<<t<<endl;
  9. }
  10. };
  11. A& getSignleA(int t)
  12. {
  13. static A s_a(t); //函数首次被调用时,初始化本地静态变量s_a
  14. return s_a;
  15. }
  16. void tFunc(int i)
  17. {
  18. getSignleA(i); //每个线程都调用getSignleA,但只有第一个调动次函数的线程能初始化静态变量s_a
  19. cout<<"thread "<<i<<endl;
  20. }
  21. int main ()
  22. {
  23. thread t[10]; //创建十个线程,每个线程都会通过tFunc调用getSignleA
  24. for(int i=0; i<10; ++i)
  25. {
  26. t[i] = thread(tFunc, i);
  27. }
  28. for(int i=0; i<10; ++i)
  29. {
  30. t[i].join();
  31. }
  32. return 0;
  33. }
  34. 运行程序输出:
  35. constructor A, thread:0
  36. thread 0
  37. thread 1
  38. thread 2
  39. thread 3
  40. thread 4
  41. thread 5
  42. thread 7
  43. thread 8
  44. thread 6
  45. thread 9
  46. 可见对象s_a只被构造了一次

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/336502
推荐阅读
相关标签
  

闽ICP备14008679号