2016-10-07 53 views
2

可以執行以下操作嗎?可以從同一個線程移動分配std ::線程對象嗎

#include <iostream> 
#include <thread> 

std::thread th; 

void foo() 
{ 
    std::cout << __func__ << std::endl; 
    th = std::thread(foo); 
} 

int main() 
{ 
    th = std::thread(foo); 
    th.join(); 
} 

gcc崩潰 - http://coliru.stacked-crooked.com/a/3c926507ab0f8a5c

我知道幾乎沒有必要這樣做,但我只想爲學術目的知道答案。

+0

在我看來,至少在'th'上有一場數據競賽,因爲它是在一個線程中讀取的,並且在沒有同步的情況下被寫入另一個線程。意識到的並不完全是你所問的。 – BoBTFish

回答

4
th = std::thread(foo); 

你沒有加入你的線程。

http://en.cppreference.com/w/cpp/thread/thread

自毀線程對象,底層的線程必須加入或脫離

作爲另一個答案的評論說,分配有相同的要求破壞,由於前一個線程對象丟失了。

+1

是的,它也有UB,因爲數據競賽,對吧? – FrozenHeart

+0

是的,但實際生成的代碼仍然可以推理。我並沒有將代碼給予我的祝福,但是你必須小心謹慎地挑選一個測試用例 - 你永遠不知道拿到測試用例的內容。 – xaxxon

相關問題