たとえば、次のコードはスレッドの 1 つに対して「3」を出力できますか?
int foo()
{
static int a = 1;
return ++a;
}
void thread1()
{
cout<<foo()<<endl;
}
void thread2()
{
cout<<foo()<<endl;
}
編集:C++ 98です
たとえば、次のコードはスレッドの 1 つに対して「3」を出力できますか?
int foo()
{
static int a = 1;
return ++a;
}
void thread1()
{
cout<<foo()<<endl;
}
void thread2()
{
cout<<foo()<<endl;
}
編集:C++ 98です
もちろん、3を出力することもできます。これを行うのは、このコードの「通常のセマンティクス」ですらあります。スレッド1はそれを1で初期化し、それをインクリメントするので、それは2です。スレッド2はそれを再びインクリメントするので、それは3です。
したがって、はい、スコープ付き静的変数は静的、つまりグローバル変数です。それらはスレッドによって共有されます。
もちろん、コードには競合状態があるため、結果は何でもかまいませんが、3が結果になる可能性があります。
ローカル静的変数はスレッド間で共有されます。
関数ローカルの静的変数の初期化は、C++11 ではスレッドセーフです (それ以前は、スレッドは存在しませんでした ;))。
一方、関数ローカルの静的変数の変更はスレッドセーフではないため、変更されたコードの動作は未定義です (競合状態のため)。