マルチスレッドということを自分がどの程度理解できているかは怪しいものだが、将来的に並列処理というものは避けて通れない予感がする。というわけで、とりあえずスレッドってものに触れてみようと例によってBoost C++ LibrariesのThreadを使ってみた。
ドキュメントによるとCallableなものを引数にしてインスタンスを生成しろとあるので、関数でも渡しておけばいいと理解した。スレッドの終了を待つにはjoin()メンバを呼び出せばいいともある。というわけで、次のようなコードを書いてみた。
- #include <iostream>
- #include <fstream>
- #include <cstdlib>
- #include <ctime>
- #include <boost/thread.hpp>
- using namespace std;
- using namespace boost;
- void writeMsg()
- {
- time_t clock;
- for (int i = 0; i < 100; i++){
- time(&clock);
- cout << "writeMsg: " << ctime(&clock);
- for(int j = 0; j < 10000; j++){
- for(int k = 0; k < 10000; k++){
- int a = j * k;
- }
- }
- }
- }
- int main()
- {
- thread thWriteMsg(&writeMsg);
- 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;
- }
- }
- }
- thWriteMsg.join();
- return EXIT_SUCCESS;
- }
要は関数から呼び出しものは「writeMSG: 時間」、メイン関数内に記載したものは「MAIN: 時間」を表示する。この2種類の表示が入り乱れればOKということになる。あまり速いとわかりにくいので、無駄にかけ算をして時間稼ぎをしている。
次のようにビルドしようとしたところで問題が発生した。
g++ -o testThread testThread.cpp
ドキュメントを見る限りでは「Build & Link.....Automatic linking」と書いてあるが、「Undefined Symbols: "boost::detail::thread_data_base::~thread_data_base()"〜」などとでてリンクに失敗しているようだ。どうもthread関連のシンボルが見つからないようだ。しょうがないので、明示的に「libboost_thread」を次のようにリンクするとうまくいった。
g++ -o testThread testThread.cpp -lboost_thread
Mac以外のほかのOSでは試していないので何ともいえないが、Mac OS Xでは「-lboost_thread」は必須らしい。
できあがったものを実行してみると、
writeMsg: Sat Feb 5 21:52:24 2011
MAIN: Sat Feb 5 21:52:24 2011
writeMsg: Sat Feb 5 21:52:24 2011
MAIN: Sat Feb 5 21:52:25 2011
writeMsg: Sat Feb 5 21:52:25 2011
MAIN: Sat Feb 5 21:52:25 2011
writeMsg: Sat Feb 5 21:52:25 2011
MAIN: Sat Feb 5 21:52:25 2011
writeMsg: Sat Feb 5 21:52:25 2011
MAIN: Sat Feb 5 21:52:26 2011
writeMsg: Sat Feb 5 21:52:26 2011
writeMsg: Sat Feb 5 21:52:26 2011
MAIN: Sat Feb 5 21:52:26 2011
writeMsg: Sat Feb 5 21:52:27 2011
MAIN: Sat Feb 5 21:52:27 2011
という具合に表示された。
ドキュメントをざっと眺めると、引数付きの関数を渡すときのコンストラクタやスレッドをグループ化するthread_groupなるものもあったので、次はそれを試してみようと思う。