4

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

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

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

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

编辑:它是 C++ 98

4

2 回答 2

8

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

所以,是的,作用域静态变量是静态的,即全局变量。它们由线程共享。

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

于 2012-10-18T10:18:29.340 回答
3

局部静态变量在线程之间共享。

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

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

于 2012-10-18T10:16:30.010 回答