ラベル Boost の投稿を表示しています。 すべての投稿を表示
ラベル Boost の投稿を表示しています。 すべての投稿を表示

1月 11, 2012

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を実行する結果になります.


11月 13, 2011

あるクラスのメンバ関数から他のメンバ関数をスレッドとして並列実行

C++でプログラムを書いているときに,クラスの中でスレッドを実行して並列処理を行いたくなった。
Boostという便利なライブラリを使って,これを実現します。

#include <boost/thread.hpp>
#include <boost/bind.hpp>
class hoge{
  private:
    thr_func(int a);
    func(){
      int b;
      boost::thread thr(boost::bind(&hoge::func, this, b); 
      thr.join();
    }
};
Boostの使い方とかはここを参照