1. ホーム
  2. c++

[解決済み] std::thread::detachはいつ使うべきですか?

2022-04-23 17:09:51

質問

を使用しなければならないことがあります。 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
}

解決方法は?

のデストラクタで std::thread , std::terminate が呼び出される場合です。

  • スレッドが参加されていない ( t.join() )
  • で、デタッチもされませんでした(with t.detach() )

したがって、常にどちらかを選択する必要があります。 join または detach を、実行の流れがデストラクタに到達する前にスレッドに追加します。


プログラムが終了するとき(つまり main その代わり、その実行は中断され、スレッドローカルオブジェクトは破壊されます。

重要なのは、このことは これらのスレッドのスタックは巻き戻されません。 そのため、いくつかのデストラクタは実行されません。これらのデストラクタが実行するはずだった動作によっては、プログラムがクラッシュしたり、強制終了したのと同じくらい悪い状況になる可能性があります。うまくいけばOSがファイルなどのロックを解除してくれるかもしれませんが、壊れた共有メモリや書きかけのファイルなどが残ってしまう可能性があります。


ということは join または detach ?

  • 使用方法 join
  • より柔軟性が必要で、スレッドの完了を待つための同期機構を提供する気がある場合を除き 自分自身で その場合は detach