4

たとえば、次のコードはスレッドの 1 つに対して「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 に答える