名稱空間
變體
操作

std::latch

來自 cppreference.com
< cpp‎ | thread
 
 
併發支援庫
執行緒
(C++11)
(C++20)
this_thread 名稱空間
(C++11)
(C++11)
(C++11)
協同取消
互斥
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
條件變數
(C++11)
訊號量
門閂和屏障
latch
(C++20)
(C++20)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危險指標
原子型別
(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 成為一次性屏障。

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 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) [編輯]