boost::thread

トップページ > 並列/並行処理 >

abstract

必要なヘッダ
<boost/thread.hpp>
出来ること
マルチスレッド
リファレンス
en

sample

// 長くてゴメンナサイ…
#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秒ごとに催促してきます。(^^;

etc

POSIXのpthreadか、もしくはWindowsが使える環境で動くスレッドライブラリです。

JavaやらRubyやら、最近の言語はちゃんと言語使用レベルで 「スレッド」 が規定されているのですが、今のところC++標準にはそういったものはありません。 なので、マルチスレッドなプログラムを出来る限りプラットフォーム非依存に書く、 というのは結構面倒な作業でした。

そこで、ACEZThreads などの portable なライブラリが便利なわけですが、そんな中の一つとして、 この boost::thread があります。

Mutex, Condition variable, TSS 辺りの基本的な部品はきちんと揃っているので、 マルチプラットフォームでマルチスレッドなソフトを書きたい方、 あるいは単にC++で書かれたスレッドライブラリを使いたい方に便利かと思います。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0