线程之间是否共享了作用域静态变量?

时间:2012-10-18 10:13:29

标签: c++ multithreading

,例如,以下代码是否可以为其中一个线程打印“3”?

int foo()
{
   static int a = 1;
   return ++a;
}

void thread1()
{
   cout<<foo()<<endl;
}

void thread2()
{
   cout<<foo()<<endl;
}

编辑:这是C ++ 98

2 个答案:

答案 0 :(得分:7)

当然它可以打印3.这甚至是这个代码的“通常语义”。线程1用1初始化它并递增它,所以它是2.线程2再次递增它,所以它是3。

所以,是的,范围内的静态变量是静态,即全局变量。它们由线程共享。

当然,代码有一个竞争条件,所以结果可能是任何东西,但3可能是结果。

答案 1 :(得分:3)

本地静态变量在线程之间共享。

函数本地静态变量的初始化在C ++ 11中是线程安全的(在此之前,线程甚至不存在;))。

另一方面,函数局部静态变量的修改不是线程安全的,因此修改后的代码具有未定义的行为(由于竞争条件)。