171

std::threadアプリケーションを高速化するために使用する必要がある場合があります。join()また、スレッドが完了するまで待機することも知っています。これは簡単に理解できますが、呼び出す場合と呼び出さない場合の違いは何detach()ですか?

detach()がなければ、スレッドのメソッドはスレッドを使用して独立して機能すると思いました。

切り離さない:

void Someclass::Somefunction() {
    //...

    std::thread t([ ] {
        printf("thread called without detach");
    });

    //some code here
}

デタッチによる呼び出し:

void Someclass::Somefunction() {
    //...

    std::thread t([ ] {
        printf("thread called with detach");
    });

    t.detach();

    //some code here
}
4

6 に答える 6

201

のデストラクタではstd::thread、次のstd::terminate場合に呼び出されます。

  • スレッドは結合されませんでした (とt.join())
  • どちらも切り離されていませんでした (with t.detach())

したがって、実行フローがデストラクタに到達する前に、常にjoinまたはdetachスレッドのいずれかを実行する必要があります。


プログラムが終了する (つまりmain戻る) とき、バックグラウンドで実行されている残りの切り離されたスレッドは待機されません。代わりに、実行が中断され、スレッド ローカル オブジェクトが破棄されます。

重要なことに、これは、これらのスレッドのスタックが巻き戻されないため、一部のデストラクタが実行されないことを意味します。これらのデストラクタが実行するアクションによっては、プログラムがクラッシュしたり強制終了されたりしたのと同じくらい悪い状況になる可能性があります。OS がファイルなどのロックを解除してくれることを願っていますが、共有メモリが破損したり、ファイルの書き込みが半分になったりする可能性があります。


では、またはを使用する必要がありますjoindetach

  • 使用するjoin
  • 柔軟性を高める必要があり、スレッドの完了を独自に待機する同期メカニズムを提供する意思がある場合を除き、その場合は使用できますdetach
于 2014-04-02T07:50:04.407 に答える
41

detachスレッドが完了するのを待つつもりがない場合は呼び出す必要がありますjoinが、スレッドは完了するまで実行を続け、スポーナー スレッドが特に待機することなく終了します。例えば

std::thread(func).detach(); // It's done when it's done

detach基本的には、実装に必要なリソースを解放しますjoin

スレッド オブジェクトが寿命を迎え、どちらjoindetach呼び出されていない場合は、致命的なエラーです。この場合terminate、呼び出されます。

于 2014-04-02T06:54:46.250 に答える
16

join()スレッドをデタッチすると、終了する前にスレッドをデタッチする必要がないことを意味しますmain()

スレッド ライブラリは、実際にはそのような各スレッドの below-mainを待機しますが、気にする必要はありません。

detach()バックグラウンドで実行する必要があるタスクがある場合に主に役立ちますが、その実行は気にしません。これは通常、一部のライブラリの場合です。バックグラウンド ワーカー スレッドを静かに作成し、それを切り離す可能性があるため、気付かないことさえあります。

于 2014-04-02T07:01:17.757 に答える