std::latch

来自cppreference.com
< cpp‎ | thread
 
 
并发支持库
线程
(C++11)
(C++20)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中弃用)
(C++11)(C++20 中弃用)
原子操作的自由函数
原子标志的自由函数
内存序
互斥
(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)
future
(C++11)
(C++11)
(C++11)
(C++11)
 
 
在标头 <latch> 定义
class latch;
(C++20 起)

latchstd::ptrdiff_t 类型的向下计数器,它能用于同步线程。在创建时初始化计数器的值。

线程可能在 latch 上阻塞直至计数器减少到零。没有可能增加或重置计数器,这使得 latch 为单次使用的屏障。

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

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

成员函数

构造 latch
(公开成员函数)
析构 latch
(公开成员函数)
operator=
[被删除]
latch 不可赋值
(公开成员函数)
以不阻塞的方式减少计数器
(公开成员函数)
测试内部计数器是否等于零
(公开成员函数)
阻塞直至计数器抵达零
(公开成员函数)
减少计数器并阻塞直至它抵达零
(公开成员函数)
常量
[静态]
实现所支持的计数器最大值
(公开静态成员函数)

示例

#include<iostream>
#include<concepts>
#include<thread>
#include<vector>
#include<latch>
#include<mutex>
 
//sleep sort
template<std::integral T>
void sleep_sort(std::vector<T>& v){
	std::latch l{static_cast<std::ptrdiff_t>(v.size())};
	std::mutex mutex;
	std::vector<T>tmp;
	for(auto& i:v)
		std::thread([](int vv,std::mutex& mtx,std::vector<T>& vec,std::latch& lt){
			std::this_thread::sleep_for(std::chrono::milliseconds(vv));
			std::lock_guard guard{mtx};
			vec.emplace_back(vv);
			lt.count_down();
		},i,std::ref(mutex),std::ref(tmp),std::ref(l)).detach();
	l.wait();
	v=tmp;
}
 
int main(){
	std::vector v{400,200,300,100,500};
	sleep_sort(v);
	std::cout<<"sorted array:"<<std::endl;
	for(auto i:v)
		std::cout<<i<<' ';
	std::cout<<std::endl;
 
	return 0;
}

可能的输出:

100 200 300 400 500

参阅

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