全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++20的同步原语latch和barrier怎么用_C++多线程编程中的栅栏同步机制

latch是一次性同步工具,用于等待计数归零后释放所有线程,适用于单次等待场景;barrier支持重复使用,允许多轮同步,适合周期性或分阶段的并行任务。

在C++20中,latchbarrier 是新增的两种同步原语,用于简化多线程编程中的等待逻辑。它们都属于“栅栏”类同步机制,但用途和行为有所不同。

什么是 latch?

latch(闩锁)是一种一次性使用的同步工具,允许一个或多个线程等待,直到某个计数器递减到零。一旦计数归零,所有等待的线程被释放,且 latch 不可重用。

主要操作包括:

  • count_down(n):将内部计数减少 n。
  • wait():阻塞当前线程,直到计数变为 0。
  • arrive_and_wait():等价于 count_down(1) 后调用 wait()。
  • try_wait():非阻塞检查是否已到达终点。

常见使用场景是主线程启动多个工作线程后,等待它们全部完成。

// 示例:使用 std::latch 等待所有线程完成

include

include

include

include iostream>


void worker(int id, std::latch& latch) {
std::cout // 模拟工作
std::this_thread::sleep_for(std::chrono::milliseconds(100 * (id + 1)));
latch.count_down(1); // 完成任务,计数减一
}

int main() {
const int N = 3;
std::latch latch(N);
std::vector<:thread> workers;

for (int i = 0; i workers.emplace_back(worker, i, std::ref(latch));
}

latch.wait(); // 主线程等待所有 worker 完成
std::cout
for (auto& w : workers) w.join();
return 0;
}

什么是 barrier?

barrier(屏障)支持重复使用,允许多个线程在某个点汇合。当指定数量的线程调用 arrive()arrive_and_wait() 后,所有线程被同时释放,并可重新开始下一轮同步。

与 latch 不同的是,barrier 可以循环使用,适合周期性同步场景,比如多阶段并行算法。

关键操作:

  • arrive():通知已到达,可能触发 completion 钩子函数。
  • arrive_and_wait():到达并等待其他线程。

completion 函数会在每次所有线程会合后执行一次,通常用于重置状态或切换阶段。

// 示例:使用 std::barrier 实现两阶段并行任务

include

include

include

include stream>

include


void stage_worker(int id, std::barrier& phase_barrier) {
// 第一阶段
std::cout std::this_thread::sleep_for(std::chrono::milliseconds(50));
phase_barrier.arrive_and_wait(); // 等待所有线程完成第一阶段

// 第二阶段
std::cout std::this_thread::sleep_for(std::chrono::milliseconds(50));
phase_barrier.arrive_and_wait(); // 等待第二阶段完成
}

int main() {
const int N = 3;
std::barrier barrier(N);
std::vector<:thread> workers;

for (int i = 0; i workers.emplace_back(stage_worker, i, std::ref(barrier));
}

for (auto& w : workers) w.join();
std::cout return 0;
}

latch vs barrier 使用建议

选择哪种同步机制取决于你的需求:

  • 如果只需要一次等待(如启动或结束),用 latch 更合适,语义清晰,性能略优。
  • 如果需要多次同步(如迭代计算、分阶段处理),应使用 barrier,它天然支持重复使用。
  • latch 不支持回调,而 barrier 允许你注册 completion 函数,在每轮同步完成后做一些清理或调度工作。

注意:两者都不是锁,不保护共享数据,仅用于控制线程执行顺序。

基本上就这些。C++20 的 latch 和 barrier 让常见的并发模式变得更简洁安全,减少了手写条件变量和互斥量的复杂度。


# 工具  # ai  # c++  # ios  # stream  # 同步机制  # for  # include  # const  # auto  # int  # void  # 循环  # 线程  # 多线程  # 主线程  # Thread  # 并发  # 算法  # 多个  # 重复使用  # 的是  # 分阶段  # 是一种  # 两种  # 适用于  # 会在  # 有所不同  # 不支持 


相关文章: 如何通过山东自助建站平台快速注册域名?  小型网站建站如何选择虚拟主机?  如何在Windows服务器上快速搭建网站?  如何快速搭建自助建站会员专属系统?  在线制作视频的网站有哪些,电脑如何制作视频短片?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何基于云服务器快速搭建网站及云盘系统?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  建站为何优先选择香港服务器?  如何在香港免费服务器上快速搭建网站?  建站之星如何快速更换网站模板?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  免费视频制作网站,更新又快又好的免费电影网站?  建站之星后台密码遗忘?如何快速找回?  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何用y主机助手快速搭建网站?  建站之星如何快速生成多端适配网站?  建站之星如何优化SEO以实现高效排名?  网站网页制作专业公司,怎样制作自己的网页?  如何自定义建站之星模板颜色并下载新样式?  如何登录建站主机?访问步骤全解析  ,交易猫的商品怎么发布到网站上去?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  建站之星备案流程有哪些注意事项?  七夕网站制作视频,七夕大促活动怎么报名?  网站制作说明怎么写,简述网页设计的流程并说明原因?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  如何在景安服务器上快速搭建个人网站?  如何用免费手机建站系统零基础打造专业网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何使用Golang table-driven基准测试_多组数据测量函数效率  焦点电影公司作品,电影焦点结局是什么?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  如何高效利用亚马逊云主机搭建企业网站?  如何快速搭建高效服务器建站系统?  建站主机如何选?性能与价格怎样平衡?  制作网站的模板软件,网站怎么建设?  小建面朝正北,A点实际方位是否存在偏差?  ,制作一个手机app网站要多少钱?  建站主机与虚拟主机有何区别?如何选择最优方案?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何选择域名并搭建高效网站?  如何选择高效可靠的多用户建站源码资源?  大连网站设计制作招聘信息,大连投诉网站有哪些?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何通过虚拟主机快速搭建个人网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。