2

libstdc++ では、<iostream>headerはのインスタンスを定義ios_base::Initします。そのコンストラクターはアトミックにカウンターを増やし、カウンターが 0 の場合は cin/cout/cerr を初期化します#include <iostream>

と同じ動作の初期化子を実装したいios_base::Init、つまり、別のグローバル変数のコンストラクターで使用される前に、ヘッダーをインクルードするとすぐにグローバル オブジェクトの一部が初期化されることを保証したい。ただし、これはアトミック操作を使用する必要があります。libstdc++ は、標準ではない GCC の拡張を使用します: http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/src/c%2B%2B98/ios_init.cc?view=markup

std::atomic を効率的に使用する方法 によると、std::atomic はアトミック操作を行う唯一の標準的な方法であるため、すべての TU で初期化子の前にグローバル アトミック変数を構築する必要があります。それを初期化するには、それを初期化する別の初期化子が必要です。悲しいことに、無限再帰に行きます。

だから私の質問は、それを行うための最良の標準的な方法は何ですか?

4

1 に答える 1

0

標準のアトミック変数には定数式コンストラクターがあります。これは、静的初期化フェーズ中(つまり、コンパイル時)に初期化されることを意味します。std::atomic<int>したがって、カウンターとしてのようなものを使用しても問題はありません。

とは言うものの、プログラムが開始前にスレッドをmain起動しない場合は、とにかくこれについてあまり心配する必要はないでしょう。

ちなみに、あなたが説明する構造は、気の利いたカウンターまたはシュヴァルツカウンターとしても知られています。

于 2012-05-09T18:24:22.723 に答える