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

  在c++11中,static靜態類對象在執行構造函數進行初始化的過程是線程安全的,有了這個特徵,咱們能夠本身動手輕鬆的實現單例類,關於如何實現線程安全的單例類,請查看c++:本身動手實現線程安全的c++單例類。下面給出一個驗證例子:html

1.清單1:staticSafe.hios

 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.cppc++

 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類對象的線程都是阻塞的。併發

相關文章
相關標籤/搜索