以下の内容はhttps://anon21.hateblo.jp/entry/2012/01/03/193518より取得しました。


CygwinでBoost.Threadを使う

並列処理をやろうと思ったらスレッドを扱うことになりますが,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

ただしメッセージの出力の部分でマルチスレッドのことを考慮していないため,うまく表示できない場合もあります.




以上の内容はhttps://anon21.hateblo.jp/entry/2012/01/03/193518より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14