2016-10-07 8 views
2

次のことはできますか?同じスレッドから割り当てられたstd :: threadオブジェクトを移動してもかまいません。

#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"にデータ競争があるのは少なくとも1つのスレッドで読み込まれ、同期なしで別のスレッドで書き込まれるからです。実現していることは、あなたが求めているものではありません。 – BoBTFish

答えて

4
th = std::thread(foo); 

スレッドに参加していません。

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

別の答えにコメントで述べたように、スレッドが

を接合または剥離されなければならない基礎となる、スレッドオブジェクトを破棄し、割り当ては、前スレッドオブジェクトので、破壊と同じ要件を有します失われます。

+1

ええ、データレースのためUBもありますよね? – FrozenHeart

+0

はい、実際に生成されたコードは引き続き推論できます。コードに私の祝福を与えているわけではありませんが、あなたがテストケースをどれくらい吟味しているかを気にする必要があります。テストケースに入るために何が取り出されたのか分かりません。 – xaxxon

関連する問題