2012-07-09 51 views
8

在Boost庫的1.50.0版本發行說明重大更改我注意到有兩個重大的變動(see here):在Boost.Thread 3.0.0

#6266最新變化:螺紋析構函數應該調用終止如果可以連接。

#6269重大變化:如果可連接,則線程移動分配應該調用終止。

這對我目前使用Boost 1.49.0的現有項目意味着什麼?我需要改變什麼嗎?如果是的話,我需要做什麼改變?如果我忘記修改我現有的一個項目,會發生什麼?我會得到編譯時錯誤(我希望如此)還是會得到討厭和難以找到的運行時問題(我絕對不希望如此)?

回答

7

當它說「突變」時,它表示「如果您以前的行爲是X,但現在是Y,您的程序就會中斷」。

對於給定的兩個變化,這意味着如果你依賴析構函數或移動分配調用join()(或detach()),我相信是以前的行爲,你的程序現在必須明確join()detach()或滿足您的朋友std::terminate() 。這不是一個編譯時錯誤,但它也不是一個不可預測的運行時行爲 - 你會得到一個很好的乾淨的崩潰,導致回到boost::thread的析構函數,這是造成問題的原因。

+1

注意,它調用終止如果可連接,那麼它將不會終止,如果線程對象先前未被連接但被分離。 – PlasmaHH 2012-07-09 11:22:35

+1

是的,我忘了'detach()'。 – Puppy 2012-07-09 15:47:33

7

下面的代碼用於正常工作,但隨着V3的程序將被終止,如同t離開其範圍,因爲thread::~thread電話std::terminate,而不是默默地從螺紋分離:

#include <boost/thread.hpp> 
#include <iostream> 

void f() 
{} 

int main() 
{ 
    { 
    boost::thread t(f); 
    } 
    std::cout << "exiting gracefully" << std::endl; 
}