最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<latch>

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

    void arrive_and_wait(ptrdiff_t update = 1);

## 概要

ラッチのカウンタ値を`update`だけ減算し、呼び出しスレッド自身もカウンタ値が`0`になるまで待機する。

## 効果

次の処理と等価：

    count_down(update);
    wait();

## 戻り値

なし

## 例外

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

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

## 例

    #include <cassert>
    #include <latch>
    #include <thread>

    // メインスレッドとサブスレッドは"同期ポイント"で互いの進行を待ち合わせる。
    // これによりメインスレッドでxに書込んだ値はサブスレッド側で安全に読出せ、
    // サブスレッドでyに書込んだ値はメインスレッド側で安全に読出せることが保証される。
    // この"同期ポイント"はランデブーポイント(Rendezvous Point)とも呼ばれる。
    int main()
    {
      int x = 0, y = 0;

      // 同期ポイントを表すラッチ: 初期カウント値=2
      std::latch sync{2};

      // サブスレッドを起動
      std::thread t([&]{
        y = 200;
        sync.arrive_and_wait();  // 同期ポイント
        assert(x == 100);
      });

      // メインスレッド処理
      {
        x = 100;
        sync.arrive_and_wait();  // 同期ポイント
        assert(y == 200);
      }

      t.join();
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

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

## 関連項目

- `count_down()`
- `wait()`