最終更新日時: 2025年09月29日 02時08分59秒 (JST)
Raclamusi が更新

履歴 編集

function
<barrier>

# std::barrier::arrive_and_wait(C++20)

    void arrive_and_wait();

## 概要

バリアのフェーズ同期ポイント上での待ち合わせ（到達通知と待機処理）を行う。 設定されていれば、次フェーズへの移行前に完了関数を呼び出す。

## 効果

`wait(arrive())` と等価。

## 戻り値

なし

## 例外

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

- `resource_unavailable_try_again` : 操作対象のネイティブハンドル型が無効
- `operation_not_permitted` : スレッドにこの操作を行う権限がない

## 例

    #include <barrier>
    #include <chrono>
    #include <iostream>
    #include <mutex>
    #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");
        sync.arrive_and_wait();
        do_task("sub:  phase-2");
        sync.arrive_and_wait();
        do_task("sub:  phase-3");
      });

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

      t.join();
    }

### 出力例

    sub:  phase-1
    main: phase-1
    main: phase-2
    sub:  phase-2
    sub:  phase-3
    main: phase-3

## バージョン

### 言語

- C++20

### 処理系

- Clang: 11.0 ✅
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `arrive()`
- `wait()`
- `arrive_and_drop()`