命名空間
變體
動作

std::latch

出自 cppreference.com
< cpp‎ | thread
 
 
並行支援函式庫
執行緒
(C++11)
(C++20)
this_thread 命名空間
(C++11)
(C++11)
(C++11)
協作式取消
互斥 (Mutual exclusion)
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
條件變數
(C++11)
旗標 (Semaphores)
閂鎖 (Latches) 與屏障 (Barriers)
latch
(C++20)
(C++20)
期約 (Futures)
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
風險指標 (Hazard Pointers)
原子型別
(C++11)
(C++20)
原子型別初始化
(C++11)(在 C++20 中棄用)
(C++11)(在 C++20 中棄用)
記憶體順序
(C++11)(在 C++26 中棄用)
原子操作的自由函式
原子旗標的自由函式
 
 
定義於標頭檔 <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)
可重複使用的執行緒屏障
(類別模板) [edit]
English Deutsch 日本語 中文(简体) 中文(繁體)