,例如,以下代码是否可以为其中一个线程打印“3”?
int foo()
{
static int a = 1;
return ++a;
}
void thread1()
{
cout<<foo()<<endl;
}
void thread2()
{
cout<<foo()<<endl;
}
编辑:这是C ++ 98
答案 0 :(得分:7)
当然它可以打印3.这甚至是这个代码的“通常语义”。线程1用1初始化它并递增它,所以它是2.线程2再次递增它,所以它是3。
所以,是的,范围内的静态变量是静态,即全局变量。它们由线程共享。
当然,代码有一个竞争条件,所以结果可能是任何东西,但3可能是结果。
答案 1 :(得分:3)
本地静态变量在线程之间共享。
函数本地静态变量的初始化在C ++ 11中是线程安全的(在此之前,线程甚至不存在;))。
另一方面,函数局部静态变量的修改不是线程安全的,因此修改后的代码具有未定义的行为(由于竞争条件)。