2016-12-29 10 views
1

スレッドローカル変数を提供するライブラリが、そのためのコンストラクタ関数を登録するためのメカニズムがありますか?スレッドローカル変数の初期化

私のライブラリは、動的に取得されたデータを使用してスレッド作成時に初期化する必要があるスレッドローカル構造体を供給したいと考えています。

構造体がグローバルでスレッドローカルではない場合は、gccの__attribute__((__constructor__))とマークされた関数を作成しますが、新しいスレッドが作成されたときにこれらのコンストラクタは再トリガしません。

答えて

3

いいえ、スレッドの作成ではコンストラクタが呼び出されません。これは良いことです。コンストラクターの自動呼び出しは、大部分のスレッドがライブラリーのコードと関係がなく、決してそれを呼び出さない潜在的に大きなアプリケーションでは、をスケールしません。

代わりに、スレッドローカルオブジェクトを使用するライブラリコードで、新しいスレッドの最初のライブラリ呼び出しで遅く構築するか、呼び出し元アプリケーションが使用するスレッドで初期化関数を明示的に呼び出す必要がありますそれ。最初の選択肢は一般にはるかに優れており、パフォーマンスへの影響は測定できないはずです。ライブラリ内のスレッドローカルストレージにアクセスすると予測可能な分岐よりも時間がかかります。

static _Thread_local int init_done; 
if (!init_done) ...