關於c++11中static類對象構造函數線程安全的驗證


  在c++11中,static靜態類對象在執行構造函數進行初始化的過程是線程安全的,有了這個特征,我們可以自己動手輕松的實現單例類,關於如何實現線程安全的單例類,請查看c++:自己動手實現線程安全的c++單例類。下面給出一個驗證例子:

1.清單1:staticSafe.h

 1 #include <iostream>
 2 #include <thread>
 3 using namespace std;
 4 class Cnum
 5 {
 6 public:
 7     Cnum()
 8     {
 9         std::cout << "construct start" << std::endl;
10         std::this_thread::sleep_for(std::chrono::seconds(5));   //構造函數中休眠5s
11         num++;
12         std::cout << "construct stop" << std::endl;
13     }
14     void Test()
15     {
16         std::cout << "id:" << std::this_thread::get_id()<<",num="<< num<<std::endl;    
17         std::this_thread::sleep_for(std::chrono::seconds(1));
18     }
19     static int num;
20 };

2. 清單2:main.cpp

 1 int Cnum::num = 0;     //初始化靜態成員
 2 void func(void* argv)
 3 {
 4     int i = *(int *)argv;
 5     std::cout <<i<< std::endl;   //每個線程啟動時,打印線程次序號
 6     static Cnum a;   //內部靜態成員變量的初始化時線程安全的,只有一個線程能執行初始化,其他線程會在此阻塞
 7     a.Test();
 8 }
 9 void main()
10 {     
11     for (int i = 0; i < 10; i++)    //開啟10個線程,模擬並發訪問情形
12     {
13             std::thread t1(func, (void *)&i);                     
14             t1.detach(); 
15     }
16     system("pause ");//暫停一下
17 }

3. 運行結果

  

  從結果中可以看出:1)當打印“construct stop” 以后,其他線程才陸續執行Test函數  2) 所有線程打印的num為1。以上現象表明:當有一個線程執行static類對象的構造函數時,其他欲訪問該static類對象的線程都是阻塞的。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM