並列処理をやろうと思ったらスレッドを扱うことになりますが,WindowsやPOSIX環境でAPIは異なります.統一的なAPIがほしいということで,C++11からはスレッドに関するライブラリが標準ライブラリに含まれるようになりました.が,まだコンパイラのほうが追いついていないのでBoost.Threadの出番となります.以下はBoost.Threadを使って,2つのスレッドからそれぞれ2/3秒ごとにメッセージを表示するコードです.
#include <iostream>
#include <boost/thread.hpp>
void f1()
{
for(int i = 0; i < 3; ++i) {
boost::this_thread::sleep(boost::posix_time::seconds(2));
std::cout << "f1() called" << std::endl;
}
}
void f2()
{
for(int i = 0; i < 3; ++i) {
boost::this_thread::sleep(boost::posix_time::seconds(3));
std::cout << "f2() called" << std::endl;
}
}
int main()
{
boost::thread th1(f1);
boost::thread th2(f2);
th1.join();
th2.join();
}
で,これをCygwin上のGCCでビルドしようと思ったんですが,setup.exeでlibboost-develをインストールしてヘッダを読み込むだけではダメなようです.Boost.Threadはドキュメント上ではAutomatic linkingと書いていますが,64ビット環境のせいかリンクされていないようで,次のようなリンカエラーが出ます.
/tmp/cc73NzXD.o:boost_thread.cpp:(.text+0x113): undefined reference to `boost::thread::join()' /tmp/cc73NzXD.o:boost_thread.cpp:(.text+0x11f): undefined reference to `boost::thread::join()' /tmp/cc73NzXD.o:boost_thread.cpp:(.text+0x12b): undefined reference to `boost::thread::~thread()' /tmp/cc73NzXD.o:boost_thread.cpp:(.text+0x137): undefined reference to `boost::thread::~thread()' /tmp/cc73NzXD.o:boost_thread.cpp:(.text+0x152): undefined reference to `boost::thread::~thread()' /tmp/cc73NzXD.o:boost_thread.cpp:(.text+0x162): undefined reference to `boost::thread::~thread()' /tmp/cc73NzXD.o:boost_thread.cpp:(.text$_ZN5boost6detail16thread_data_baseC2Ev[boost::detail::thread_data_base::thread_data_base()]+0x1a): undefined reference to `vtable for boost::detail::thread_data_base' /tmp/cc73NzXD.o:boost_thread.cpp:(.text$_ZN5boost11this_thread5sleepINS_10posix_time7secondsEEEvRKT_[void boost::this_thread::sleep<boost::posix_time::seconds>(boost::posix_time::seconds const&)]+0x31): undefined reference to `boost::this_thread::sleep(boost::posix_time::ptime const&)' /tmp/cc73NzXD.o:boost_thread.cpp:(.text$_ZN5boost6threadC1IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE[boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)]+0x23): undefined reference to `boost::thread::start_thread()' /tmp/cc73NzXD.o:boost_thread.cpp:(.text$_ZN5boost6detail11thread_dataIPFvvEED1Ev[boost::detail::thread_data<void (*)()>::~thread_data()]+0x16): undefined reference to `boost::detail::thread_data_base::~thread_data_base()' collect2: ld returned 1 exit status
しょうがないので,次のようにちゃんとライブラリを指定してやると,ビルドすることができました.
g++ boost_thread.cpp -o boost_thread -lboost_thread-mt
実行すると,f1()とf2()のメッセージがそれぞれ2/3秒ごとに表示されます.
$ ./boost_thread f1() called f2() called f1() called f1() called f2() called f2() called
ただしメッセージの出力の部分でマルチスレッドのことを考慮していないため,うまく表示できない場合もあります.