2016-05-03 50 views

答えて

14

C++ threadオブジェクト(常にではない)は、OSまたはプラットフォームの概念であり、実行のスレッドを表します。

thread::join()が呼び出されると、呼び出しスレッドは実行スレッドが完了するまでブロックされます。基本的に、これはスレッドが終了したときを知るために使用できる1つのメカニズムです。 thread::join()が返されると、実行のOSスレッドが完了し、C++ threadオブジェクトが破棄される可能性があります。

thread::detach()が呼び出され、実行スレッドがthreadオブジェクトから「切り離され」、もはやthreadオブジェクトで表されなくなりました。それらは2つの独立したものです。 C++ threadオブジェクトは破棄され、実行のOSスレッドは継続できます。プログラムがその実行スレッドがいつ完了したかを知る必要がある場合、他の何らかのメカニズムを使用する必要があります。 join()は、そのthreadオブジェクトではもはや呼び出すことができません。これはもはや実行スレッドに関連付けられていないからです。

C++ threadオブジェクトをまだ「結合可能」にしている間は、そのオブジェクトを破壊するとエラーが発生したとみなされます。つまり、C++ threadオブジェクトを破棄するには、join()を呼び出す(そして完了させる)必要があります。またはdetach()を呼び出す必要があります。 C++ threadオブジェクトが破棄されても結合可能である場合、例外がスローされます。

C++ threadオブジェクトが実行スレッドを表しています(つまり、join不可能することができます。)いくつかの他の方法:

  • デフォルトはthreadオブジェクトではありませんので、実行のスレッドを表すものではありません構築しました参加可能。
  • 移動元のスレッドは実行スレッドを表さないため、結合できません。
3

join()スレッドを強制終了しません。実際には、スレッドのメイン関数が返るまで待機します。もしそうなら、あなたのスレッド主な機能は次のようになります。

while (true) { 
} 

join()

は永遠に待つことになるだろう。

detatch()もスレッドを強制終了しません。実際にはstd::threadには、std::threadオブジェクトが破棄されてもこのスレッドが実行され続けると伝えられます。 C++はstd :: threadデストラクタをチェックして、スレッドがジョインまたはデタッチされていることを確認し、このチェックが失敗した場合にはプログラムを終了します。

したがって、次のコードのmain機能の最初の行のコメントを外すと、クラッシュします。 2行目または3行目のコメントを外してもOKです。一般

#include <thread> 

void func() { 
} 

void fail1() { 
    std::thread t(func); 
    // will fail when we try to destroy t since it is not joined or detached 
} 

void works1() { 
    std::thread t(func); 
    t.join(); 
} 

void works2() { 
    std::thread t(func); 
    t.detach(); 
} 

int main() { 
    // fail1(); 
    // works1(); 
    // works2(); 
} 
関連する問題