std::latch
From cppreference.com
| ヘッダー <latch> で定義 |
||
| class latch; |
(C++20以降) | |
latch クラスは std::ptrdiff_t 型のダウンカウンターであり、スレッドの同期に使用できます。カウンターの値は生成時に初期化されます。スレッドは、カウンターがゼロにデクリメントされるまでラッチ上でブロックすることがあります。カウンターをインクリメントしたりリセットしたりすることはできないため、ラッチは一度だけ使用可能なバリアとなります。
デストラクターを除き、std::latch のメンバー関数を同時に呼び出してもデータ競合は発生しません。
目次 |
[編集] データメンバー
| 名前 | 定義 |
std::ptrdiff_t counter |
内部カウンター (説明用のメンバオブジェクト*) |
[編集] メンバー関数
latch を構築する(public member function) | |
latch を破棄する(public member function) | |
| operator= [削除] |
latch は代入不可(public member function) |
| 非ブロッキングでカウンターをデクリメントする (public member function) | |
| 内部カウンターがゼロに等しいかテストする (public member function) | |
| カウンターがゼロになるまでブロックする (public member function) | |
| カウンターをデクリメントし、ゼロになるまでブロックする (public member function) | |
定数 | |
| [static] |
実装がサポートするカウンターの最大値 (public static member function) |
[編集] ノート
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_latch |
201907L |
(C++20) | std::latch
|
[編集] 例
このコードを実行
#include <functional> #include <iostream> #include <latch> #include <string> #include <thread> struct Job { const std::string name; std::string product{"not worked"}; std::thread action{}; }; int main() { Job jobs[]{{"Annika"}, {"Buru"}, {"Chuck"}}; std::latch work_done{std::size(jobs)}; std::latch start_clean_up{1}; auto work = [&](Job& my_job) { my_job.product = my_job.name + " worked"; work_done.count_down(); start_clean_up.wait(); my_job.product = my_job.name + " cleaned"; }; std::cout << "Work is starting... "; for (auto& job : jobs) job.action = std::thread{work, std::ref(job)}; work_done.wait(); std::cout << "done:\n"; for (auto const& job : jobs) std::cout << " " << job.product << '\n'; std::cout << "Workers are cleaning up... "; start_clean_up.count_down(); for (auto& job : jobs) job.action.join(); std::cout << "done:\n"; for (auto const& job : jobs) std::cout << " " << job.product << '\n'; }
出力
Work is starting... done: Annika worked Buru worked Chuck worked Workers are cleaning up... done: Annika cleaned Buru cleaned Chuck cleaned
[編集] 関連項目
| (C++20) |
再利用可能なスレッドバリア (class template) |