2011-07-26 9 views
4

ThreadLocalをC++で実装する最良の方法を知っている人は、必要なときに値を設定して取得することができます。C++ ThreadLocalの実装

私はウィキペディアのThreaLocalについて読んでいました。

C++ 0xは、thread_localキーワードを導入しています。

は、誰もがgccのこのための宣言と、おそらくその使用方法を知っています:それはさておき、様々なC++ コンパイラの実装は、スレッドローカル 変数を宣言するための具体的な方法を提供し?

答えて

3

これは通常、OSが使用するスレッドライブラリの一部です。 Linuxでは、スレッドローカルストレージはpthread_key_create,pthread_get_specificおよびpthread_set_specificの関数で処理されます。ほとんどのスレッドライブラリはこれをカプセル化し、C++インタフェースを提供します。 Boostでは、thread_specific_ptr ...

2

VC10は、より柔軟に、あなたに同じことを示しますcombinableという名前の新しいクラスを持っている参照してください。

3

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_createpthread_[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 
ブーストを使用して