ThreadLocalをC++で実装する最良の方法を知っている人は、必要なときに値を設定して取得することができます。C++ ThreadLocalの実装
私はウィキペディアのThreaLocalについて読んでいました。
C++ 0xは、thread_localキーワードを導入しています。
は、誰もがgccのこのための宣言と、おそらくその使用方法を知っています:それはさておき、様々なC++ コンパイラの実装は、スレッドローカル 変数を宣言するための具体的な方法を提供し?
ThreadLocalをC++で実装する最良の方法を知っている人は、必要なときに値を設定して取得することができます。C++ ThreadLocalの実装
私はウィキペディアのThreaLocalについて読んでいました。
C++ 0xは、thread_localキーワードを導入しています。
は、誰もがgccのこのための宣言と、おそらくその使用方法を知っています:それはさておき、様々なC++ コンパイラの実装は、スレッドローカル 変数を宣言するための具体的な方法を提供し?
これは通常、OSが使用するスレッドライブラリの一部です。 Linuxでは、スレッドローカルストレージはpthread_key_create
,pthread_get_specific
およびpthread_set_specific
の関数で処理されます。ほとんどのスレッドライブラリはこれをカプセル化し、C++インタフェースを提供します。 Boostでは、thread_specific_ptr
...
MSVCでは、thread_local
の代わりに__declspec(thread)
と呼ばれます。
はhttp://msdn.microsoft.com/en-us/library/9w1sdazb(v=vs.80).aspx
VC10は、より柔軟に、あなたに同じことを示しますcombinableという名前の新しいクラスを持っている参照してください。
gccでは、__thread
を使用してスレッドローカル変数を宣言できます。しかし、これは定数初期化子を持つPOD型に限られており、必ずしもすべてのプラットフォームで利用できるわけではありません(linuxとWindowsの両方で利用可能です)。あなたはthread_local
が使用するのと同じように、変数宣言の一部としてそれを使用する:
__thread int i=0;
i=6; // modify i for the current thread
int* pi=&i; // take a pointer to the value for the current thread
POSIXシステムでは、あなたがあなた自身を管理するスレッドローカルデータにアクセスするためにpthread_key_create
とpthread_[sg]et_specific
を使用することができ、およびWindows上であなたはTlsAlloc
を使用することができます同じ端にはTls[GS]etValue
があります。
一部のライブラリは、コンストラクタとデストラクタで型を使用できるようにするためのラッパーを提供しています。たとえば、boostはboost::thread_specific_ptr
を提供し、各スレッドにローカルな動的に割り当てられたオブジェクトを格納できます。just::threadライブラリは、thread_local
キーワードの動作をC++ 0xとよく似たJSS_THREAD_LOCAL
マクロを提供します。
boost::thread_specific_ptr<std::string> s;
s.reset(new std::string("hello")); // this value is local to the current thread
*s+=" world"; // modify the value for the current thread
std::string* ps=s.get(); // take a pointer to the value for the current thread
か、単に使用して::スレッド:
JSS_THREAD_LOCAL(std::string,s,("hello")); // s is initialised to "hello" on each thread
s+=" world"; // value can be used just as any other variable of its type
std::string* ps=&s; // take a pointer to the value for the current thread
ブーストを使用して