
在C++20中,std::barrier 和 std::latch 是两个重要的线程同步工具,用于协调多个线程的执行。它们比传统的互斥锁和条件变量更高级,适用于特定的协作场景。
std::latch 是一个一次性使用的同步机制,允许一个或多个线程等待,直到计数器减为零。一旦计数到达零,所有等待线程被释放,且 latch 不可重用。
常用方法:
典型使用场景是主线程启动多个工作线程后,等待它们全部初始化完成
。
#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 类似于 latch,但支持重复使用。它允许多个线程在某个点“会合”,当指定数量的线程都到达后,才继续执行。与 latch 不同,barrier 可以在每次同步后重置状态。
Reachout.ai
一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造
142
查看详情
常用方法:
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。注意这两个类都需要 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商务座选择与配置说明