背景:
c++20 关于多线程并发新增了 latch, barrier, semaphore ,接下来就按照一个一个进行介绍
latch
latch 是一次性使用的线程协调点, 一旦给定数量的线程达到latch点时, 所有线程都会解除阻塞, 并继续执行. 基本上它是一个计数器, 在每个线程到达latch点时倒数, 一旦计数器达到0, latch 将无限制保持在一个有信号的状态, 所有阻塞线程都将解除阻塞, 随后到达latch点的任何线程会立刻被允许执行.
latch 由 std::latch实现, 在<latch> 中定义, 构造函数接收需要到达latch点的所需线程数, 到达latch点的线程可以调用arrive_and_wait(), 它递减latch 计数器并阻塞, 直到latch有信号为止. 线程也可以通过调用wait 在不减少计数器的情况下阻塞在latch点上, try_wait() 方法可用与检查计数器是否达到零, 最后如果需要,还可以通过count_down()来减少计数器, 而不会阻塞.
代码如下:
#include<latch>
#include <vector>
#include <iostream>
#include <thread>
#include <memory>
#include <chrono>
int main()
{
std::vector<std::jthread> threads;
std::latch startLatch{ 1 };
for (int i = 0; i < 10; ++i)
{
threads.push_back(std::jthread{[i, &startLatch]{
std::cout<< i <<" in wait" <<std::endl;
startLatch.wait();
std::cout<&