名前空間
変種

std::thread::join

提供: cppreference.com
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
 
<tbody> </tbody>
void join();
(C++11以上)

*this が表すスレッドが実行を終えるまで現在のスレッドをブロックします。

*this が表すスレッドの完了は対応する join() からの成功の戻りに対して同期します。

*this 自体に対しては同期は行われません。 複数のスレッドから同じ thread オブジェクトの join() を並行的に呼ぶことは競合状態を構成し、未定義動作となります。

引数

(なし)

戻り値

(なし)

事後条件

joinable()false である。

例外

エラーが発生した場合は std::system_error

エラーコンディション

  • this->get_id() == std::this_thread::get_id() (デッドロック) の場合は std::errc
  • スレッドが有効でない場合は std::errc
  • joinable()false の場合は std::errc

#include <iostream>
#include <thread>
#include <chrono>

void foo()
{
    // 何か重い処理をしているつもり
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

void bar()
{
    // 何か重い処理をしているつもり
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    std::cout << "starting first helper...\n";
    std::thread helper1(foo);

    std::cout << "starting second helper...\n";
    std::thread helper2(bar);

    std::cout << "waiting for helpers to finish..." << std::endl;
    helper1.join();
    helper2.join();
 
    std::cout << "done!\n";
}

出力:

starting first helper...
starting second helper...
waiting for helpers to finish...
done!

参考文献

  • C++20 standard (ISO/IEC 14882:2020):
  • 32.4.2.5 Members [thread.thread.member]
  • C++17 standard (ISO/IEC 14882:2017):
  • 33.3.2.5 thread members [thread.thread.member]
  • C++14 standard (ISO/IEC 14882:2014):
  • 30.3.1.5 thread members [thread.thread.member]
  • C++11 standard (ISO/IEC 14882:2011):
  • 30.3.1.5 thread members [thread.thread.member]

関連項目

スレッドを thread オブジェクトから独立して実行できるようにします
(パブリックメンバ関数) [edit]
スレッドが合流可能かどうか、すなわち潜在的に並列文脈で実行中かどうか調べます
(パブリックメンバ関数) [edit]