2013-08-29 20 views
5

だから、これは非常に簡単そうです:なぜ明示的にスレッドに参加する必要がありますか?

#include <iostream> 
#include <thread> 

void second() { 
    cout << "Don't thread on me!" << endl; 
} 

int main() { 
    thread t { second }; 
    t.join(); 

    return 0; 
    cin.get(); 
} 

私はjoin()が含まれていない場合、システムはabort()を呼び出します。私はこれを理解していない、スレッドは独自に終了するべきではない?スレッドを結合することは、コードを適切にカプセル化するのが難しくなるようです。これには何が関係していますか?

+2

が、この程度の良い読書です:http://www.domaigne.com/blog/computing/joinable-and- detached-threads/ – LarryPel

+2

'main'は' int'を返す必要があります。 – chris

+2

これは、 '#include'ディレクティブがいくつか見つからないためコンパイルされません。 http://sscce.org/ –

答えて

4

これはC++スレッドライブラリの設計の一部です。あなたはjoinのスレッドが必要ではありません、またdetachすることができます。しかし、デフォルトのdetachスレッドを使用することはお勧めできません。それはそれ自体の複雑さをもたらします。

あなたが言っているのとは逆に、これはコードがカプセル化するのをより困難にするとは思わない。抽象レベルにはさまざまなレベルがあり、スレッドレベルを選択するということは、スレッドが存在し、それらを処理する必要があることを意識する必要があることを意味します。あなたは、たとえば、抽象化の異なるレベルを選択することも異なるものについては

:ここ

int main() { 
    auto f = std::async([](){ std::cout << "Don't tread on me\n" << std::flush; }); 
    f.get();  // Wait for the task to complete 
} 
+0

ああ、私はまだ非同期に触れていない。 – sircodesalot

+0

@sircodesalot: 'スレッド'は低レベルのプリミティブです。 'std :: future <>'/'std :: promise <>'/'std :: async'はそれほど高いレベルではありませんが、標準では合意できるものから始める必要がありました。近い将来、標準化のためにますます高水準の案が提案されると思います。そして、より高いレベルのツールを提供する並行性のためのライブラリが既にあります。 –

+0

** 30.3.1.3 ** [注意:デストラクタ内のjoinable()スレッドを暗黙的に切り離したり結合したりすると、デバッグの正確さ(デタッチ)が困難になるか、または例外の場合にのみ パフォーマンス(結合)バグが発生する可能性があります。育った。したがって、プログラマは、スレッドが依然としてjoinableである間にデストラクタが実行されないようにする必要があります。 -end note] – Jason

4

デフォルトでは、スレッドを生成するスレッドは、子プロセスが完了するまで追跡して待機することができます(たとえば、複数のスレッドに2つ以上のスレッドを委任してから、完了)。

detachを使用すると、スレッドをスポーンスレッドから切り離し、スレッドを独立して実行させることができます。

+0

Aha!それは面白い。 – sircodesalot