std::latch
出自 cppreference.com
| 定義於標頭檔 <latch> |
||
| class latch; |
(自 C++20 起) | |
latch 類別是一個型別為 std::ptrdiff_t 的向下計數器,可用於執行緒同步。計數器的值在建立時初始化。執行緒可能會在 latch 上阻塞,直到計數器遞減至零。此計數器無法增加或重置,這使得 latch 成為一種單次使用的屏障(barrier)。
std::latch 的成員函式(解構函式除外)之並行呼叫不會產生資料競爭(data race)。
目錄 |
[編輯] 資料成員
| 名稱 | 定義 |
std::ptrdiff_t counter |
內部計數器 (僅用於闡述的成員物件*) |
[編輯] 成員函式
建構一個 latch(公開成員函式) | |
解構 latch(公開成員函式) | |
| operator= [已刪除] |
latch 不可指派(公開成員函式) |
| 以非阻塞方式遞減計數器 (公開成員函式) | |
| 測試內部計數器是否為零 (公開成員函式) | |
| 阻塞直到計數器達到零 (公開成員函式) | |
| 遞減計數器並阻塞直到其達到零 (公開成員函式) | |
常數 | |
| [靜態] |
實作所支援的計數器最大值 (公開靜態成員函式) |
[編輯] 附註
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__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) |
可重複使用的執行緒屏障 (類別模板) |