4

C++11 標準には、静的変数をスレッド ローカルにする、thread_local 指定子という新しい追加機能が含まれています。標準の thread_local は、非自明な型 (コンストラクタとデストラクタを持つ型) をサポートしています。残念ながら、GCC__threadは、拡張機能として提供される指定子を介して自明な型のみをサポートします。thread_local上でエミュレートする方法はあり__threadますか?の実装__threadは非常に高速であるため (通常の変数に 2 つの間接参照を加えたものと同等)、ホット パス内のライブラリ関数は避けたいと考えています。

GCC と Linux を使用しています。携帯性は必要ありません。

4

1 に答える 1

7

番号。

gcc には現在、スレッドの作成/破棄時に __thread 用に ctor/dtor を実行する機能がないため、ctor/dtor を実行する必要がない場合を除きます (その場合、__thread はまさに必要なものであり、その上でエミュレートするものは何もありません)。が必要です)、thread_local のように機能するものはまだありません。

ただし、遅延初期化 (のような__thread T* ptr; if(!ptr){...}) を使用できる場合は、スレッドの破棄時に実行される破棄関数を登録できる場所と一緒に何かをハックして、pthread_key_createそこにすべてのポインターを登録できます。

boost::thread_specific_ptrまたは、多かれ少なかれこれを行うものを使用できます(おそらく、基になる実装の詳細として __thread TLS を使用せずに)

于 2012-08-21T21:42:32.813 に答える