C++11ではTLS(Thread Local Storage)のためにthread_localキーワードが導入されますが,これもやはりコンパイラの方が追いついていないのでBoostの力を借りるのが楽です.Boost.Threadではshared_ptrのように使えるthread_specific_ptrが用意されています.以下は1から5までの整数を足し合わせる計算と掛け合わせる計算を2スレッドで並列に行うコードです.
#include <iostream>
#include <boost/thread.hpp>
static boost::thread_specific_ptr<int> pn_;
void f1()
{
pn_.reset(new int(0));
for(int i = 1; i <= 5; ++i) {
*pn_ += i;
}
std::cout << *pn_ << std::endl;
}
void f2()
{
pn_.reset(new int(1));
for(int i = 1; i <= 5; ++i) {
*pn_ *= i;
}
std::cout << *pn_ << std::endl;
}
int main()
{
boost::thread th1(f1);
boost::thread th2(f2);
th1.join();
th2.join();
}
スレッドのはじめでnewしたintオブジェクトをthread_specific_ptrにセットし,以降で計算に使っています.ここでf1()とf2()でわざと同じpn_を使っていますが,pn_が指している内容はスレッド毎に異なっているので,競合は起こりません.上のコードを実行すると,以下のような結果になります.
$ ./boost_tls 15 120
なお,pn_が指しているオブジェクトはデフォルトではスレッド終了時にdeleteされます.別の方法でオブジェクトを解放したい場合は,thread_specific_ptrのコンストラクタで解放のための関数を指定することができます.