// 長くてゴメンナサイ…
#include <iostream>
#include <string>
#include <boost/thread.hpp>
using namespace std;
class urger
{
typedef boost::mutex::scoped_lock lock;
volatile bool end_flag;
boost::mutex ef_guard;
boost::condition_variable_any exitRequest;
public:
urger() : end_flag(false) {}
// スレッドのメインルーチン
void u_main()
{
// 基本的に無限ループしておく
for(;;)
{
lock lk(ef_guard);
if( end_flag ) break;
// 現在の5秒後の時間を計算
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
xt.sec += 5;
// 終了通知を待ちます。ただし5秒たったら待ち解除
if( exitRequest.timed_wait( lk, xt ) ) break;
else cout << "\n何か書くのじゃー!: " << flush;
}
}
void exit()
{
// 終了を通知します。
lock lk(ef_guard);
end_flag = true;
exitRequest.notify_one();
}
};
int main()
{
// 催促スレッド起動
urger u;
boost::thread thr( &urger::u_main, &u );
// 入力待ち
cout << "何か書いてね: ";
string str;
getline( cin, str );
// 入力が終わったら、終了して欲しいことをスレッドに通知
u.exit();
// 催促スレッドの終了待ち
thr.join();
cout << "Thank you!" << endl;
return 0;
}
何も打ち込まないでいると、5秒ごとに催促してきます。(^^;
POSIXのpthreadか、もしくはWindowsが使える環境で動くスレッドライブラリです。
JavaやらRubyやら、最近の言語はちゃんと言語使用レベルで 「スレッド」 が規定されているのですが、今のところC++標準にはそういったものはありません。 なので、マルチスレッドなプログラムを出来る限りプラットフォーム非依存に書く、 というのは結構面倒な作業でした。
そこで、ACE や ZThreads などの portable なライブラリが便利なわけですが、そんな中の一つとして、 この boost::thread があります。
Mutex, Condition variable, TSS 辺りの基本的な部品はきちんと揃っているので、 マルチプラットフォームでマルチスレッドなソフトを書きたい方、 あるいは単にC++で書かれたスレッドライブラリを使いたい方に便利かと思います。