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

履歴 編集

function
<barrier>

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

[[nodiscard]] arrival_token arrive(ptrdiff_t update = 1);

概要

バリアのフェーズ同期ポイントへの到達通知を行い、待機処理用の到達トークンを発行する。 設定されていれば、次フェーズへの移行前に完了関数を呼び出す。

事前条件

update > 0 かつ update が現行バリアフェーズの予定カウントに等しいかそれより小さいこと。

効果

現行フェーズのフェーズ同期ポイントに関連付けされたarrival_token型オブジェクトを構築する。 その後に、予定カウントをupdateだけ減算する。

戻り値

構築されたarrival_tokenオブジェクトを返す。

例外

この関数は、以下の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

処理系

関連項目