2012-02-14 4 views
2

質問はthis questionの拡張です。入れ子になったローカルクラスの静的メソッド

元の質問では、OPは、静的関数のローカル変数をデータ競合から保護する必要があるかどうかを尋ねました。その答えは、各スレッドが独自のスタックフレームを取得することでした。静的関数を持つネストされたクラスにも同じことが当てはまると想定するのは安全でしょうか?

// Function called by several threads 
int someFunc(int a, int b) 
{ 
    struct nestedStruct 
    { 
    static int do_something(int& a, int& b) 
    { 
     a = rand(); 
     b = rand(); 
     return a + b; 

    } 
    }; 

    return nestedStruct::do_something(a, b); 
} 
+0

すべてのローカル変数がスタック上にあり、すべてのスレッドが別々のスタックを取得します。それが静的関数であろうと入れ子にされたクラスであろうと、それはそれとは無関係です。 –

+0

入れ子になったクラス(関数内で定義されていること)は、静的メンバーをまったく持てますか?私は静的メンバー変数で試しました。うまくいきませんでした。 – Sharad

+0

@Sharad:確かに... http://ideone.com/tl8Za – Samaursa

答えて

2

randスレッド(私はそれがあるかどうかわからないんだけど)安全であるならば、外側の関数とネストされた静的な機能の両方に問題がないので、外someFuncは、独自のスタックフレームを持っています。

+0

'rand'についての良い点は、おそらく保護されていない静的なシード値を更新するでしょう。 –

+0

VCでは安全です、POSIXは一般的ではありません( 'rand_r'参照)。 –

+0

私は 'rand()'(+1)と同意、良い点がありますが、これは最初の質問からのコピー/ペーストであり、質問のポイントではありません。 – Samaursa

関連する問題