新闻中心
c++中的std::barrier和std::latch怎么用_c++线程同步工具用法详解

在C++20中,std::barrier 和 std::latch 是两个重要的线程同步工具,用于协调多个线程的执行。它们比传统的互斥锁和条件变量更高级,适用于特定的协作场景。
std::latch 的用法
std::latch 是一个一次性使用的同步机制,允许一个或多个线程等待,直到计数器减为零。一旦计数到达零,所有等待线程被释放,且 latch 不可重用。
常用方法:
- std::latch l(count);:构造一个初始值为 count 的 latch。
- l.count_down();:将内部计数减一(可被多个线程调用)。
- l.wait();:阻塞当前线程,直到计数变为0。
- l.arrive_and_wait();:等价于 count_down() 后立即 wait()。
典型使用场景是主线程启动多个工作线程后,等待它们全部初始化完成
。
#include <thread>
#include <latch>
#include <iostream>
<p>std::latch start_latch(3); // 等待3个线程</p><p>void worker(int id) {
std::cout << "Worker " << id << " ready.\n";
start_latch.count_down(); // 通知准备完成
}</p><p>int main() {
std::thread t1(worker, 1);
std::thread t2(worker, 2);
std::thread t3(worker, 3);</p><pre class='brush:php;toolbar:false;'>start_latch.wait(); // 等待三个线程都准备好
std::cout << "All workers ready, starting...\n";
t1.join(); t2.join(); t3.join();
return 0;}
std::barrier 的用法
std::barrier 类似于 latch,但支持重复使用。它允许多个线程在某个点“会合”,当指定数量的线程都到达后,才继续执行。与 latch 不同,barrier 可以在每次同步后重置状态。
Reachout.ai
一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造
142
查看详情
常用方法:
- std::barrier b(count);:创建一个需要 count 个线程参与的 barrier。
- b.arrive();:通知一个线程已到达,返回一个 arrive_token,可用于后续的 wait。
- b.arrive_and_wait();:线程到达并等待其他线程同步完成。
barrier 常用于循环并行任务中,比如多线程迭代计算。
#include <thread>
#include <barrier>
#include <iostream>
<p>std::barrier sync_point(3);
int step = 0;</p><p>void worker(int id) {
for (int i = 0; i < 3; ++i) {
std::cout << "Worker " << id << " step " << i << " working...\n";</p><pre class='brush:php;toolbar:false;'> // 模拟工作
std::this_thread::sleep_for(std::chrono::milliseconds(100 * id));
sync_point.arrive_and_wait(); // 所有线程在此同步
std::cout << "All workers completed step " << i << "\n";
}}
int main() { std::thread t1(worker, 1); std::thread t2(worker, 2); std::thread t3(worker, 3);
t1.join(); t2.join(); t3.join(); return 0;
}
latch 和 barrier 的区别
虽然两者都用于线程同步,但设计目的不同:
- std::latch 是一次性使用的,适合“启动”或“结束”这类单次事件。
- std::barrier 支持重复使用,适合周期性同步,如每轮并行计算后的会合。
- latch 更轻量,只支持向下计数一次;barrier 允许每个周期重新开始。
基本上就这些。选择哪个取决于是否需要重复同步。对于一次性等待,用 latch;对于多轮协作,用 barrier。注意这两个类都需要 C++20 支持,编译时请启用 -std=c++20。
以上就是c++++中的std::barrier和std::latch怎么用_c++线程同步工具用法详解的详细内容,更多请关注其它相关文章!
# 如何实现
# 驻马店新蔡搜索关键词排名怎么样
# 宜昌网站建设哪里有优化
# 常州贵州网站建设
# 黄冈网站建设课程定位
# 台州网站建设公司大型
# seo 网站 出租
# 营销推广比赛公众号
# 东城本地网站建设
# 聚焦矩阵seo老徐
# 刷百度关键词排名优惠
# 迭代
# 内存管理
# 是一个
# 工具
# 尼克
# 重复使用
# 适用于
# 多线程
# 如何使用
# 多个
# 同步机制
# 区别
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
美团外卖商家服务中心入口 美团商家版官网入口
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
MongoDB聚合管道:正确匹配对象数组中_id的方法
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
谷歌google账号怎么注册账号 谷歌账号注册官方流程
css链接悬停下划线样式如何自定义_使用::after结合content和transition
优化大型XML文件解析:基于Python流式处理的内存高效方案
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
Fabric模组开发:自定义物品与物品组的现代管理方法
Tabulator表格日期时间排序问题及自定义解决方案
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
Go语言中的*string:深入理解字符串指针
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
j*a toString()的覆盖
AO3镜像入口大全 AO3网页版内容访问全集
谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
c++中为什么推荐使用using替代typedef_c++现代化类型别名
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
qq游戏网页版直接玩_qq游戏免下载快速入口
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
如何在J*a中使用Locale处理多语言环境
Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程
抖音网页版怎么|直播|_抖音网页版开播操作指南
Lar*el递归关系中排除子孙节点的策略
FullCalendar 自定义按钮样式定制指南
京东单号查询入口_京东快递订单追踪入口
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
windows10怎么关闭系统提示音_windows10彻底静音设置方法
腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程
蛙漫安全无毒 官方认证的绿色入口
解决Flask中Quill编辑器内容提交失败及TypeError的指南
Go RPC HTTP服务正确实现与常见陷阱解析
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
在Qt QML中通过Python字典动态更新TextEdit内容的教程
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
汽水音乐在线版入口_汽水音乐网页播放手册
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间


2025-11-14
浏览次数:次
返回列表