std::latch

来自cppreference.com
< cpp‎ | thread
 
 
并发支持库
线程
(C++11)
(C++20)
(C++20)
this_thread 命名空间
(C++11)
(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++26)
风险指针





原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中弃用)
(C++11)(C++20 中弃用)
内存定序
原子操作的自由函数
原子标志的自由函数
 
 
在标头 <latch> 定义
class latch;
(C++20 起)

latch 类是一种 std::ptrdiff_t 类型的向下计数器,它能用于同步线程。在创建时初始化计数器的值。线程可能在闩上阻塞直至计数器减少到零。没有可能增加或重置计数器,这使得 latch 成为一种单次使用的屏障。

同时调用 latch 的成员函数,除了析构函数,不引入数据竞争。

不同于 std::barrier,一个参与线程能减少 std::latch 多于一次。

数据成员

成员名 定义
counter (私有) std::ptrdiff_t 类型的内部计数器。
(仅用于阐述的成员对象*)

成员函数

构造 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{"未工作"};
    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 + " 已工作";
        work_done.count_down();
        start_clean_up.wait();
        my_job.product = my_job.name + " 已清理";
    };
 
    std::cout << "工作启动... ";
    for (auto& job : jobs)
        job.action = std::thread{work, std::ref(job)};
 
    work_done.wait();
    std::cout << "完成:\n";
    for (auto const& job : jobs)
        std::cout << "  " << job.product << '\n';
 
    std::cout << "清理工作线程... ";
    start_clean_up.count_down();
    for (auto& job : jobs)
        job.action.join();
 
    std::cout << "完成:\n";
    for (auto const& job : jobs)
        std::cout << "  " << job.product << '\n';
}

输出:

工作启动... 完成:
  Annika 已工作
  Buru 已工作
  Chuck 已工作
清理工作线程... 完成:
  Annika 已清理
  Buru 已清理
  Chuck 已清理

参阅

(C++20)
可复用的线程屏障
(类模板)