2

gcc と c++ (pre c++11 と post) を使用したローカル スタティックの動作を理解しようとしています。多くの場合、メンバー関数で次のようなことをしていることに気づきます。

struct Foo
{
    void foo() 
    {
        static const bool bar = someFunc();
        //etc
    }
};

たとえば、 はどこにsomeFunc()ありますかgetenv("SOME_ENV_VAR")。上記のコードで、 を管理するルールは何barですか? 上記のローカル静的を複数のスレッドから保護するために、gccが同期メカニズムをコンパイルする(何がわからない)と信じていますが、参照はありません。それがなくなったら、物事はどのように変化しconstますか?または、それをスレッドローカルにすると__thread? そしてfoo()メンバー関数ではない場合は?

4

1 に答える 1

2

ルールは実際には gcc ではなく C++ std によって定義されています: http://cpp0x.centaur.ath.cx/stmt.dcl.html

私はそれを言うだろう:

  • gcc は初期化を保護しますが、静的な使用は保護しません。変数は最初のブロックに入ったときに初期化されます
  • 静的ストレージである限り、const は影響しません。
  • __thread 変数は、独自の初期化を使用して初期化され、追加のロックによって保護されません (jmetcalfe のコメントで指摘されているように)。
  • static はブロック スコープにある必要があるため、{} ペアだけでも、どのブロックでもかまいません。
  • (Aurelienによる、コメントを参照) someFunc は一度だけ呼び出されます

再帰からの再入力やデッドロックが許可されないなど、他にも問題があります。すべて上記のリンクで説明されています。また、C++ 03 と 11 の std バージョンは、このトピックに関して少し異なります。

見積もり:

変数の初期化中に制御が同時に宣言に入った場合、同時実行は初期化の完了を待機します。

$6.7.4、C++11

これは、スレッドセーフであることを意味します、新しい標準のみです。とにかく gcc では、これは -f[no-]threadsafe-statics オプションによって制御されます。

私は反対票にも興味があります。つまり、リンクが間違っていると思われる場合は、その理由を教えてください。そうすれば、私や他の人が知ることができます.

于 2013-02-13T19:26:15.960 に答える