void arrive_and_wait(ptrdiff_t update = 1);
概要
ラッチのカウンタ値をupdate
だけ減算し、呼び出しスレッド自身もカウンタ値が0
になるまで待機する。
効果
次の処理と等価:
戻り値
なし
例外
この関数は、以下の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++: ??