信息发布→ 登录 注册 退出

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++线程同步工具用法详解的详细内容,更多请关注其它相关文章!


相关文章: QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  Typer应用中灵活处理命令行参数的令牌化与解析  苹果手机如何防止被恶意App追踪  将PCM16音频转换为W*并编码为Base64:浏览器环境下的手动处理指南  CSS图片焦点样式实现教程:理解与应用tabindex属性  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  理解Python模块与全局变量的作用域管理  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  理解J*aScript Promise的微任务队列与执行顺序  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  Django模型中自动计算可用余额的实现方法  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  提升Kafka消费者健壮性:会话超时处理与消息处理语义  千牛数据看板网页版_千牛数据看板网页版访问方法  顺丰快件物流信息 官方网站查询入口  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  处理Kafka消息时会话超时与实现幂等性消费者  mysql如何分析事务日志_mysql事务日志分析方法  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  如何配置Composer的PSR-4自动加载_Composer自动加载命名空间映射实践教程  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  生成rdflib自定义SPARQL函数:参数匹配与实践指南  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  新三国志曹操传110级星符试炼夏侯渊极难攻略  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  Composer如何解决json扩展缺失的错误  J*aScript打印功能_j*ascript输出控制  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  win11怎么清理更新缓存 Win11删除Windows Update下载文件释放空间【技巧】  EMS快递官网app_中国邮政速递物流手机客户端  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  React列表渲染与独立状态管理:避免全局状态影响局部更新  c++如何使用Meson构建系统_c++比CMake更快的构建工具  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  Angular中父组件异步更新子组件复选框状态的实践指南  微信群消息显示延迟如何解决 微信群消息刷新优化方法  J*a实现学校排课程序_面向对象结构化项目示例  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  MongoDB聚合管道:正确匹配对象数组中_id的方法  12306选座怎么选到商务座_12306商务座选择与配置说明 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!