新闻中心

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

2025-11-14
浏览次数:
返回列表
c++kquote>std::latch为一次性同步,用于等待固定数量事件完成,如线程初始化;std::barrier支持重复使用,适用于多轮循环协作,如并行迭代同步。两者均需C++20,选择依据是是否需要周期性同步。

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

在C++20中,std::barrierstd::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 Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

Reachout.ai 142 查看详情 Reachout.ai

常用方法:

  • 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 <&lt "\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点秒杀攻略 天猫爆款抢购时间 

搜索