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 的其他成員是沒有鎖的(線程不安全)。