最近のマイブームboost::threadをもう少しゴニョゴニョしてみた。
今回はクラスをインスタンス化するときにスレッド生成して、そのクラスのメンバ関数をバックグランドで実行する。スレッドの同期はデストラクタ内で行う。つまり、プログラム内でクラスをインスタンス化すると、メイン関数の処理を気にせず裏でひたすらメンバ関数を実行している感じ。
- #include <iostream>
- #include <string>
- #include <cstdlib>
- #include <ctime>
- #include <boost/thread.hpp>
- #include <boost/bind.hpp>
- using namespace std;
- using namespace boost;
- class threadWriter{
- private:
- string thName_;
- thread th_;
- public:
- void writeMsg() {
- time_t clock;
- for (int i = 0; i < 100; i++){
- time(&clock);
- cout << this->thName_ << ": " << ctime(&clock);
- for(int j = 0; j < 10000; j++){
- for(int k = 0; k < 10000; k++){
- int a = j * k;
- }
- }
- }
- }
- threadWriter(){ }
- threadWriter(string thName)
- :thName_(thName),th_(bind(&threadWriter::writeMsg, this)){ }
- ~threadWriter()
- {
- this->th_.join();
- }
- };
- int main()
- {
- string thName="THREAD 1";
- threadWriter thw1(thName);
- time_t clock;
- for (int i = 0; i < 100; i++){
- time(&clock);
- cout << "MAIN: " << ctime(&clock);
- for(int j = 0; j < 10000; j++){
- for(int k = 0; k < 10000; k++){
- int a = j * k;
- }
- }
- }
- return EXIT_SUCCESS;
- }
32行目で初期化子を使ってクラスのthread型のメンバ変数に、メンバ関数オブジェクトを渡している。このとき、boost::bindを使用してメンバ関数のオブジェクトを作成している。
35行目のデストラクタ内でスレッドの終了を待っている。これによって、スレッドが終了して初めてインスタンスが破棄されることになる。
実行結果はこんな感じ
MAIN: Mon Feb 7 00:34:08 2011
THREAD 1: Mon Feb 7 00:34:08 2011
MAIN: Mon Feb 7 00:34:08 2011
THREAD 1: Mon Feb 7 00:34:08 2011
MAIN: Mon Feb 7 00:34:09 2011
THREAD 1: Mon Feb 7 00:34:09 2011
THREAD 1: Mon Feb 7 00:34:09 2011
MAIN: Mon Feb 7 00:34:09 2011
THREAD 1: Mon Feb 7 00:34:10 2011
MAIN: Mon Feb 7 00:34:10 2011
THREAD 1: Mon Feb 7 00:34:10 2011
MAIN: Mon Feb 7 00:34:10 2011
THREAD 1: Mon Feb 7 00:34:10 2011
MAIN: Mon Feb 7 00:34:10 2011
THREAD 1: Mon Feb 7 00:34:11 2011
MAIN: Mon Feb 7 00:34:11 2011
MAIN: Mon Feb 7 00:34:11 2011
MAIN: Mon Feb 7 00:34:11 2011
ただ、なぜか最初の表示だけ「: Mon Feb 7 00:33:34 2011」となり「THREAD 1」が表示されない。今日は疲れたので、調べるのは今度にしよう。