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