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 的其他成员是没有锁的(线程不安全)。