并发支持库(7)-闩锁和屏障

devtools/2024/10/18 2:29:20/

闩锁和屏障提供了一种同步方式,可以让一个或者多个阻塞,直到计数器减少至零。

latch

latch可以看作一个计数器,构造一个latch对象时会初始化计数器的数值。调用count_down接口可以减少计数器,所有调用wait接口的线程将阻塞直到计数器变为零。

latch还提供了try_wait接口用于检测计数器是否为零,arrive_and_wait会减少计数器并阻塞直到计数器变为零。

latch的使用场景可以是:一些工作线程需要等待一些前置任务线程完成才能开始,这种情况下工作线程使用wait接口等待,每个前置任务线程完成后调用count_down接口减少计数器,当所有的前置任务完成后,计数器减少到零,工作线程开始执行。

代码示例:

std::latch latch(5);
std::vector<std::jthread> workers(3);
std::vector<std::jthread> preWorkers(5);auto FuncWork = [&](int i)
{latch.wait();std::string res = "work: " + std::to_string(i) + "\n";std::cout << res;
};auto FuncPreWorke = [&](int i)
{std::string res = "prework: " + std::to_string(i) + "\n";std::cout << res;latch.count_down();
};for (std::size_t i = 0; i < workers.size(); ++i)
{workers[i] = std::jthread(FuncWork, (int)i);
}for (std::size_t i = 0; i < preWorkers.size(); ++i)
{preWorkers[i] = std::jthread(FuncPreWorke, (int)i);
}

可能的输出结果:

prework: 2
prework: 0
prework: 1
prework: 3
prework: 4
work: 2
work: 0
work: 1

barrier

和latch相同的是,barrier也可以阻塞线程直到计数器变为零:

template<class CompletionFunction>
class barrier;

和latch不同的是,latch的计数器到达零之后不能重置,是一种一次性的同步工具,而barrier是可重用的,当barrier计数器变为零后,将调用CompletionFunction函数,并解除所有等待线程的锁定,然后计数器将重置,进入下一轮的同步。

barrier的使用场景可以是:并行地多个阶段的任务,每个阶段的任务需要在前一个阶段地任务完成后才能开始。

代码示例:

auto CompleteFunc = []() noexcept
{std::cout << "Complete" << std::endl;
};std::vector<std::jthread> workers(5);
std::barrier barrier(workers.size(), CompleteFunc);auto WorkFunc = [&](int i)
{std::string str = "work: " + std::to_string(i) + " step 1\n";std::cout << str;barrier.arrive_and_wait();str = "work: " + std::to_string(i) + " step 2\n";std::cout << str;barrier.arrive_and_wait();
};for (std::size_t i = 0; i < workers.size(); ++i)
{workers[i] = std::jthread(WorkFunc, (int)i);
}

可能的输出结果:

work: 1 step 1
work: 2 step 1
work: 0 step 1
work: 3 step 1
work: 4 step 1
Complete
work: 4 step 2
work: 3 step 2
work: 0 step 2
work: 2 step 2
work: 1 step 2
Complete


http://www.ppmy.cn/devtools/117919.html

相关文章

曲线图异常波形检测系统源码分享

曲线图异常波形检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

Python爬虫bs4基本使用

一、bs4 1、bs4获得标记的子集或父集或兄弟节点 &#xff08;1&#xff09;子集&#xff1a; 通过contents和children可以获得子集&#xff0c;前者获得的是字符串列表&#xff0c;后者获得的是一个列表迭代器对象&#xff0c;需要遍历获得内容 比如我们有以下代码和数据&a…

尚硅谷----智尚代驾项目----Day7(续)------预估乘客订单数据之Drools

Hello uu 们&#xff01;感谢你们的收看&#xff0c;话不多说&#xff0c;今天开始我们的Drools之旅 Drools介绍 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎&#xff0c;可以将复杂且多变的业务规则从硬编码中解放出来&#xff0c;以规则脚本的形式存放在文…

Visual Studio导出动态库

1、创建新项目&#xff0c;选择如下 2、工程目录结构如下 3、编写pch.h文件&#xff0c;内容如下 // pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次&#xff0c;提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能&#xff0c;包括代码完成和许多代码浏…

Pymysql cursor.execute 批量执行插入语句踩坑

注意看cursor.execute()的官方注释&#xff1a; 括号里可以不带参数&#xff0c;如果要带参数&#xff0c;必须要是tuple&#xff0c;list 或者dict类型 而在我原来的错误代码里&#xff1a; 我将list类型的values又转换成了str&#xff0c;用逗号连接&#xff0c;传进了execu…

EasyExcel将数据库里面的数据生成excel文件

EasyExcel官方文档 1.在model模块导入依赖 <!-- 生成报表--> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency> 2.修饰实体类 package…

七彩云南文化旅游网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

基于深度学习的多智能体协作

基于深度学习的多智能体协作是一种通过多个智能体相互协作完成复杂任务的框架&#xff0c;利用深度学习技术来优化智能体之间的合作与决策过程。多智能体系统广泛应用于自动驾驶、机器人群体、游戏AI、资源调度、无人机编队等领域&#xff0c;其中每个智能体通常具有自主性&…