2017-08-16 12 views
1

基本的なスレッド管理を学んでいるうちに、これらの行(太字)を本で理解することが困難でした。あなたがスレッドを開始したら実行中のスレッドとスレッドオブジェクトの関係

、あなたは明示的にそれが完了するまで待機する かどうかを決定する必要があります(と結合することによりセクション2.1.2をそれ-参照)または がで(それ自身で実行するためにそれを残しますそれを切り離す - セクション2.1.3を参照)。 std :: threadオブジェクトが破棄される前に決定しないと、 プログラムが終了します(std :: threadデストラクタは std :: terminate()を呼び出します)。したがって、 例外が存在する場合でも、 スレッドが正しく結合または切り離されていることを確認することが不可欠です。このシナリオを扱うテクニックについては、2.1.3節を参照してください。 std :: thread オブジェクトが破棄される前にこの決定を下す必要があることに注意してください。スレッド自体は、結合する前に長い を終了してもよいし、デタッチする前ににしてから スレッドstd :: threadオブジェクトが破棄された後にも長く実行される可能性があります。 スレッドオブジェクトが破壊された後も、スレッドの実行を行い

?誰でもサンプルコードまたはリファレンスを持っていますか?

+1

'{STD ::(SomeLongRunningFunction)番目のスレッド。 th.detach();/* thはここでは破棄されますが、SomeLongRunningFunctionはワーカースレッド上で実行し続けます* /} ' –

+2

デタッチ後、スレッドはstd :: threadオブジェクトとは関係ありません。 – halfelf

+0

ルールは単純です:スレッドは、エントリ関数から戻るか、スレッドが所属する実行可能ファイルが終了するまで常に実行されます。 – Frank

答えて

3

これは、スレッドの有効期間がスレッドオブジェクトの有効期間と関連付けられていないことを意味します。

したがって、次のコード:

#include <thread> 
#include <iostream> 

int main() { 
    { //scope the thread object 
     std::thread thr = std::thread([]() { 
      std::this_thread::sleep_for(std::chrono::seconds(1)); 
      std::cout << "Thread stuff\r\n"; 
     }); 
     thr.detach(); 
    } //thr is destroyed here 
    std::cout << "thr destroyed, start sleep\r\n"; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
    std::cout << "sleep over\r\n"; 
} 

ウィル出力:

thr destroyed, start sleep 
Thread stuff 
sleep over 
+1

これは*可能な*出力です。 「糸くず」が最初に現れることがあります。 –

+0

本当ですが、私はそれがほとんどの場合のポイントを説明していると思います。 – bsruth

+0

@Hiいつ起こることができますか? –

関連する問題