以下の内容はhttps://anon21.hateblo.jp/entry/2012/01/08/102714より取得しました。


Boost.ThreadのTLSを使う

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のコンストラクタで解放のための関数を指定することができます.




以上の内容はhttps://anon21.hateblo.jp/entry/2012/01/08/102714より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14