2012年1月11日水曜日

Boost::threadの簡単な排他処理

以前にBoostを用いてスレッドを立てましたが,これまたBoostのライブラリを使って簡単にスレッドセーフを実現する方法をメモしておきます。

#include <boost/thread.hpp>
#include <boost/bind.hpp>

boost::mutex mtx;

void hoge1(int &a){
  boost::mutex::scoped_lock lock(mtx);
  for(int n=0; n<3; ++n){
    std::cout << "hoge1:" << a+n << std::endl;
  }
  std::cout << std::endl;
  return;
}

void hoge2(int &b){
  boost::mutex::scoped_lock lock(mtx);
  for(int n=0; n<3; ++n){
    std::cout << "hoge2:" << b+n << std::endl;
  }
  std::cout << std::endl;
  return;
}

int main(int argc, char **argv){
  int c = 0;
  boost::thread thr1(boost::bind(&hoge1, c));
  boost::thread thr2(boost::bind(&hoge2, c));

  thr1.join();
  thr2.join();
  return 0;
}
これを実行すると
hoge1:0
hoge1:1
hoge1:2
hoge2:0
hoge2:1
hoge2:2
という感じになってくれると思います.

boost::mutex::scoped_lockは,デストラクタでmutexをアンロックしてくれる機能を持っています.
つまり,hoge1, hoge2内で定義されているscoped_lockはそれぞれの関数を抜ける際に破棄されるのと同時にmutexを自動的にアンロックしてくれます.
なので,この場合hoge1を実行したのちにhoge2を実行する結果になります.