2016-10-07 37 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

相关问题