最終更新日時(UTC):
が更新

履歴 編集

function
<barrier>

std::barrier::wait(C++20)

void wait(arrival_token&& arrival) const;

概要

バリアのフェーズ同期ポイント上での待機処理のみ行う。

事前条件

arrivalが、現行フェーズまたは同じバリアオブジェクトの直前フェーズのフェーズ同期ポイントに関連付けされていること。

効果

std::move(arrival)に関連付けされた同期ポイントにおいて、該当同期ポイントのフェーズにおけるフェーズ完了ステップが実行されるまで、呼び出しスレッドをブロックする。

戻り値

なし

例外

この関数は、以下のerror conditionを持つsystem_error例外オブジェクトを送出する可能性がある:

#include <barrier>
#include <chrono>
#include <iostream>
#include <thread>
#include <utility>

// (ダミーの)タスク処理関数
void do_task(const char* msg)
{
  static std::mutex cout_mtx;

  std::this_thread::sleep_for(std::chrono::seconds(1));
  {
    std::lock_guard lk{cout_mtx};
    std::cout << msg << std::endl;
  }
}

int main()
{
  std::barrier<> sync{2};

  // ワーカスレッド起動
  std::thread t([&]{
    do_task("sub:  phase-1");

    // 自スレッドはブロックせずに第2フェーズに移行し、
    // 第1フェーズ同期ポイント待機用トークンを発行する。
    auto token = sync.arrive();
    do_task("sub:  phase-2(a)");

    // 第1のフェーズ同期ポイントで待機する。
    sync.wait(std::move(token));
    do_task("sub:  phase-2(b)");
  });

  // メインスレッド処理
  {
    do_task("main: phase-1(a)");
    do_task("main: phase-1(b)");
    sync.arrive_and_wait();
    do_task("main: phase-2");
  }

  t.join();
}

出力例

main: phase-1(a)
sub:  phase-1
main: phase-1(b)
sub:  phase-2(a)
sub:  phase-2(b)
main: phase-2

バージョン

言語

  • C++20

処理系

関連項目