c++11 靜態成員線程安全?

c++11 要求保證函數內部靜態變量線程安全。
實測是保證靜態成員構造的時候線程安全。


#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;
class Cnum
{
public:
    Cnum()
    {
        std::cout << "construct start" << std::endl;
        sleep(3);
        num++;
        std::cout << "construct stop" << std::endl;
    }
    void Test()
    {
        std::cout << "Test" << std::endl;
        sleep( 3 );
        num++;
    }
    static int num;
};
int Cnum::num=0;
void* func(void* argv)
{
    static Cnum a;
    std::cout<<"ok"<<std::endl;
    a.Test();
}
int main()
{
    pthread_t thread[10];
    for (int i=0;i<10;i++)
    {
         pthread_create(&thread[i], NULL,func, NULL);
    }
     for (int i=0;i<10;i++)
     {
         pthread_join(thread[i],NULL);
     }
    std::cout<<"Cnum::num: "<<Cnum::num<<std::endl;
    return 0;
}

結果:
可以看到在第一個線程打印出 construct start之後。其他線程並沒有打印出 construct start 或者 ok 等。說明所有線程都被阻塞了。當第一個線程打印出 construct stop 之後(構造結束之後),Test 是同時打印出來的。

結論:
靜態成員:了構造的時候是會鎖其他線程(線程安全)。訪問 static 的其他成員是沒有鎖的(線程不安全)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章