1

あるバージョンのgccの後で、次のようなものを使用していると聞きました。

static A* a = new A();
return a;

シングルトンに対してスレッドセーフであり、http://locklessinc.com/articles/singleton_pattern/などから適応したものはもう必要ありません...

誰かが私がこれについて読むことができる場所への特定の参照またはリンクを持っていますか?

4

2 に答える 2

3

ドラフト標準(n3337.pdf)のセクション6.7、ポイント4:

静的ストレージ期間(3.7.1)またはスレッドストレージ期間(3.7.2)のすべてのブロックスコープ変数のゼロ初期化(8.5)は、他の初期化が行われる前に実行されます。静的ストレージ期間を持つブロックスコープエンティティの一定の初期化(3.6.2)は、該当する場合、そのブロックが最初に入力される前に実行されます。実装は、名前空間スコープ(3.6.2)で静的またはスレッドストレージ期間を持つ変数を静的に初期化することが許可されているのと同じ条件で、静的またはスレッドストレージ期間を持つ他のブロックスコープ変数の早期初期化を実行できます。それ以外の場合、このような変数は、コントロールが最初に宣言を通過するときに初期化されます。このような変数は、初期化の完了時に初期化されたと見なされます。変数の初期化中に制御が宣言に同時に入る場合、同時実行は初期化の完了を待機する必要があります。88変数の初期化中に制御が宣言に再帰的に再入力する場合、動作は未定義です。

于 2012-06-26T17:58:28.090 に答える
1

GCCは、クロスベンダーのItanium C++ABIに準拠しています。関数ローカル統計のスレッドセーフな初期化をカバーする関連セクションは、2.8初期化ガード変数3.3.2ワンタイムコンストラクションAPIであり、次のように述べています。

マルチスレッドのサポートを予期しない実装では、ガード変数の最初のバイト(つまり、アドレスが最小のバイト)をチェックし、その値がゼロの場合にのみ初期化してから、ゼロ以外の値に設定します。 。

ただし、(スレッドセーフのために明示的なユーザー制御を要求するのではなく)自動的にスレッドセーフな1回限りの初期化をサポートすることを目的とした実装では、次のAPI関数を使用できます。

そのAPIの初期のGCC実装にはいくつかのバグがありましたが、それらはすべて修正されており、GCCバージョン4.3から正しく機能していると思います(おそらく以前は、思い出せず、現在参照を見つけることができません)。

ただし、シングルトンは悪い、悪いパターンです。使用しないでください。

于 2012-06-26T19:08:59.483 に答える