新闻中心

C++的std::barrier和std::latch怎么用?C++20线程同步原语【并发编程】

2025-12-16
浏览次数:
返回列表
std::latch是一次性同步原语,用于等待指定数量的操作完成,计数归零后唤醒所有等待线程且不可重用;std::barrier是可重用同步原语,支持多轮阶段性汇合,并可选抵达回调函数。

c++的std::barrier和std::latch怎么用?c++20线程同步原语【并发编程】

std::barrierstd::latch 是 C++20 引入的两个轻量级同步原语,用于协调多个线程在某个点“汇合”(synchronize),但用途和生命周期有本质区别:前者可重用、后者一次性。

std::latch:一次性的“门闩”

std::latch 用来等待一组操作全部完成。它内部维护一个计数器,初始值由构造函数指定;每次调用 count_down() 计数器减一;当计数器归零,所有阻塞在 wait() 的线程被唤醒——且之后无法重置或复用。

典型场景:主线程启动多个工作线程,等它们全部初始化完毕再统一开始执行。

  • 构造时传入期望的线程数(如 std::latch ready(4) 表示等 4 次 count_down
  • 各线程完成准备后调用 ready.count_down()
  • 主线程调用 ready.wait() 阻塞,直到计数为 0
  • 不能重复使用,也不能增加计数;用完即弃

std::barrier:可重复使用的“路障”

std::barrier 也基于计数,但它支持“阶段式同步”——所有线程到达后一起通过,然后自动重置计数器,进入下一轮等待。适合循环协作场景,比如多线程迭代计算。

它还支持可选的“抵达后回调”(arrival phase function),在最后一名线程抵达、所有线程释放前执行一次(常用于汇总、交换数据等)。

FashionLabs FashionLabs

AI服装模特、商品图,可商用,低价提升销量神器

FashionLabs 86 查看详情 FashionLabs
  • 构造时指定参与线程数,例如 std::barrier sync(4)
  • 每个线程调用 sync.arrive_and_wait() —— 先抵达,再阻塞,等全员到齐才返回
  • 若需在同步点做全局操作,可用带回调的构造:std::barrier sync(4, []{ /* 每轮同步前执行一次 */ });
  • 无需手动管理状态,自动循环,适合多轮协作

别混淆:latch vs barrier 的关键区别

二者名字相似,但设计目标不同:

  • std::latch 是“等待完成”——像发令枪前的起跑线,所有人就位后只响一次
  • std::barrier 是“阶段性汇合”——像接力赛每一段的交接区,每轮都清空重来
  • latch 没有回调,barrier 可配回调;latch 不可重用,barrier 天然可重用
  • 两者都不拥有线程,也不负责线程创建/销毁,只是同步点

实际用法小提醒

它们头文件都是 <barrier></barrier>,注意编译器需支持 C++20(如 GCC 10+、Clang 11+、MSVC 19.28+),并开启 -std=c++20

不推荐用它们替代 mutex 或 condition_variable 做细粒度互斥;它们解决的是“集体行动步调一致”的问题,不是“保护共享数据”。用错场景反而引入竞态或死锁。

基本上就这些。不复杂但容易忽略细节——记清“一次”还是“多次”,就能选对工具。

以上就是C++的std::barrier和std::latch怎么用?C++20线程同步原语【并发编程】的详细内容,更多请关注其它相关文章!


# 的是  # 南昌外贸网站推广  # 罗湖网站优化比较好  # 黔南seo营销业务招聘  # 深圳网势互联营销推广  # 买鞋的网站建设需要  # 佛山网站优化排名服务商  # 上海的seo怎么样  # 武昌网站建设公司  # 句容seo搜索优化  # 大理快手营销推广招聘  # 新特性  # 都是  # 回调函数  # 如何实现  # 核心技术  # 可选  # 死锁  # 多个  # 多线程  # 回调  # 区别  # 并发编程  # c++  # ai  # 工具 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  抓大鹅无需下载版 抓大鹅秒玩版入口  jQuery Mask 插件中实现电话号码固定前导零的教程  163邮箱登录密码 163邮箱忘记密码找回  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  红果短剧网页版官网入口 官方最新网址发布  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  Lar*el 8 多关键词数据库搜索优化实践  Composer如何在生产环境安全地执行composer update  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  苹果手机如何防止被恶意App追踪  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  MongoDB聚合管道:正确匹配对象数组中_id的方法  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  Win11怎么开启省电模式_Win11电池节电模式自动开启  HTML长属性值处理:表单action路径优化与代码规范应对  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  创客贴用户入口官网登录 创客贴网页版电脑版系统  AngularJS $http POST请求数据传递与Go后端接收实践  韩小圈电脑版在线入口_网页版免费登录地址  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  美团外卖商家服务中心入口 美团商家版官网入口  在Socket.IO连接中实现Access Token自动更新与动态重连  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  Python多线程中正确使用sigwait处理SIGALRM信号  React项目中导航栏Logo自适应布局:避免裁剪与布局溢出  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  精准捕获:如何在页面中监听除特定元素外的所有点击事件  随机参数递归函数的基准调用次数与时间复杂度探究  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  学习通在线学习平台 学习通网页版直接进入课程中心  微信客户端如何收红包_微信客户端接收红包使用教程  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  b站怎么看视频的弹幕数量_b站弹幕数量查看方法 

搜索