Boost.Thread可使用多線程執行可移植C++代碼中的共享數據。它提供了一些類和函數來管理線程自己,還有其它一些爲了實如今線程之間同步數據或者提供針對特定單個線程的數據拷貝。
頭文件:
#include <boost/thread.hpp>多線程
線程定義
boost::thread 類是負責啓動和管理線程。每一個boost::thread對象表明一個單獨的執行線程,是不可拷貝的。因爲它是能夠被移動到,因此它們能夠被保存到會改變大小的容器中,而且從函數返回。這使得線程建立的詳細信息能夠被封裝到一個函數中。
boost::thread make_thread();函數
void f()
{
boost::thread some_thread = make_thread();
some_thread.join();
}oop
啓動線程
一個新的線程能夠經過傳遞一個可被調用的類型對象來啓動,這個對象能夠不須要給構造器參數就被喚醒。對象被拷貝到內存,而且在最新建立的線程上喚醒。若是對象不能被拷貝,boost::ref能夠以引用的方式來傳遞給函數對象。在這種狀況下,用戶的boost.thread必須確保對象的引用的生命期必須比最新建立的執行線程要長。this
struct callable
{
void operator()();
};線程
boost::thread copies_are_safe()
{
callable x;
return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OKrest
boost::thread oops()
{
callable x;
return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
// this leads to undefined behaviour對象
若是你用一個函數或者可調用的對象但願建立一個boost::thread 的實例須要提供一些參數,這些能夠經過給它的構造體傳遞另外的參數來辦到。內存
void find_the_question(int the_answer);get
boost::thread deep_thought_2(find_the_question,42);
參數被拷貝到內部線程結構裏:若是須要傳遞一個引用,可使用boost::Ref,只是對可調用對象的引用。
沒有指定限制傳遞的額外參數的數量。同步
線程中的異常
若是傳入到boost::thread構造體的函數或者可調用的對象拋出了一個異常並且喚醒它的不是boosst::thread_interrupted類型,std::terminate()會被調用來結束這個線程。
等待
當表明一個執行線程的線程對象被破壞時,這個線程變成分離的,一旦它被分離,將會繼續執行知道喚醒由構造體提供的函數或者可調用對象執行結束,或者程序已經結束。線程也能夠經過調用detach()成員函數來顯示的分離。在這種情形下,線程對象將不在表示一個當前分離的線程,而是一個非線程體。
爲了等待一個線程執行完畢,必須使用join()和timed_join()成員函數。join()會阻塞調用的線程直到線程結束。若是線程剛剛執行結束,或者它已經不表明一個線程,join()會當即返回。timed_join()也是相似的,可是調用它若是在指定的時間流逝後線程仍然沒有結束它也會返回。
中斷
一個正在運行的線程能夠經過調用相應的boost::thread對象的interrupt()成員函數來中斷。當被中斷的線程在下次執行一個指定的中斷點(或者若是它在同時執行一個的時候被鎖)並開啓中斷時,在被中斷的線程中就會拋出一個boost::thread_interrupted異常。若是沒有被捕獲,這會致使結束被中斷線程的執行。與其餘異常同樣,棧就會被釋放,自動存儲期對象的析構體將會被執行。
若是一個線程須要避免被中斷,能夠建立一個boost::this_thread::disable_interruption實例。這個類的對象在構造體建立線程的時候禁止了中斷,能夠在析構體調用以前的任意地方恢復容許中斷。
void f()
{
// interruption enabled here
{
boost::this_thread::disable_interruption di;
// interruption disabled
{
boost::this_thread::disable_interruption di2;
// interruption still disabled
} // di2 destroyed, interruption state restored
// interruption still disabled
} // di destroyed, interruption state restored
// interruption now enabled
}
經過構造一個boost::this_thread::restore_interruption實例能夠臨時轉換一個boost::this_thread::disable_interruption實例形成的影響,只要在有問題的地方傳遞一個boost::this_thread::disable_interruption對象。這會從新恢復中斷狀態到當boost::this_thread_diable_interruption對象被構造時,而且在次禁止中斷當boost::this_thread::restore_interruption對象被破壞時。
void g()
{
// interruption enabled here
{
boost::this_thread::disable_interruption di;
// interruption disabled
{
boost::this_thread::restore_interruption ri(di);
// interruption now enabled
} // ri destroyed, interruption disable again
} // di destroyed, interruption state restored
// interruption now enabled
}
咱們能夠經過調用boost::this_thread::interruption_enabled()來查詢中斷的狀態。
預約義的中斷點
如下函數當容許中斷時可能會拋出boost::thread_interrupted異常。
boost::thread::join()
boost::thread::timed_join()
boost::condition_variable::wait()
boost::condition_variable::timed_wait()
boost::condition_variable_any::wait()
boost::condition_variable_any::timed_wait()
boost::thread::sleep()
boost::this_thread::sleep()
boost::this_thread::interruption_point()
線程IDboost::thread::id類能夠用來標識一個線程。每一個運行的執行線程都有一個特有的ID,能夠經過對應的boost::thread的get_id()成員函數來得到ID。