0

0

c++怎么使用std::latch和std::barrier进行线程同步_C++20多线程同步原语使用教程

冰火之心

冰火之心

发布时间:2025-11-14 08:17:02

|

664人浏览过

|

来源于php中文网

原创

std::latch用于一次性同步,主线程等待多个工作线程完成任务,计数归零后释放所有线程;std::barrier支持重复使用,适合多轮协作场景,每轮所有线程到达后执行可选完成函数并继续下一轮。

c++怎么使用std::latch和std::barrier进行线程同步_c++20多线程同步原语使用教程

在C++20中,std::latchstd::barrier 是两个新的线程同步原语,用于简化多线程程序中的等待逻辑。它们比传统的条件变量更简洁、高效,适用于不同场景下的线程协调。

std::latch:一次性倒计时同步

std::latch 是一个一次性使用的同步机制,它允许一个或多个线程等待,直到一个计数器减到零。一旦计数归零,所有等待的线程被释放,且 latch 不可重用。

常用方法:

  • count_down(n):将内部计数器减少 n,不会阻塞。
  • wait():阻塞当前线程,直到计数器变为 0。
  • arrive_and_wait(n):等价于 count_down(n) 后调用 wait()。

适用场景:主线程启动多个工作线程,等待它们全部完成某阶段任务。

立即学习C++免费学习笔记(深入)”;

示例代码:

MCP官网
MCP官网

Model Context Protocol(模型上下文协议)

下载
#include 
#include 
#include 
#include 

int main() { std::latch latch(3); // 需要3个线程到达

std::vector threads;
for (int i = 0; i < 3; ++i) {
    threads.emplace_back([&](int id) {
        std::cout << "线程 " << id << " 完成第一阶段\n";
        latch.count_down(1); // 完成后倒计时减1
    }, i);
}

latch.wait(); // 主线程等待所有线程完成
std::cout << "所有线程已就绪,继续执行...\n";

for (auto& t : threads) {
    t.join();
}

}

std::barrier:可重复使用的屏障

std::barrier 与 latch 类似,但支持重复使用。当指定数量的线程调用 arrive()arrive_and_wait() 后,所有线程被同时释放,并可以进入下一轮同步。

关键特性:

  • 可多次使用,适合循环协作场景。
  • 可选地指定“完成函数”(completion function),在每次所有线程到达后执行一次。

示例:三个线程进行两轮并行计算,每轮结束后同步。

#include 
#include 
#include 
#include 

int main() { std::barrier sync_point(3, []{ std::cout << "【所有线程完成本轮】\n"; });

auto worker = [&](int id) {
    for (int round = 0; round < 2; ++round) {
        std::cout << "线程 " << id << " 执行第 " << round + 1 << " 轮\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(100 * (id + 1)));
        sync_point.arrive_and_wait(); // 等待其他线程完成本轮
    }
};

std::vector threads;
for (int i = 0; i < 3; ++i) {
    threads.emplace_back(worker, i);
}

for (auto& t : threads) {
    t.join();
}

}

latch 与 barrier 的选择建议

根据使用需求决定:

  • 如果只需要一次等待(如初始化完成、任务结束通知),用 std::latch 更轻量。
  • 如果多个阶段需要反复同步(如并行迭代算法),则选择 std::barrier
  • 两者都不支持动态调整参与线程数,设计时需提前确定数量。

基本上就这些。这两个新工具让C++20的多线程同步更直观、安全,减少了手动管理条件变量的复杂性。不复杂但容易忽略的是:确保每个线程对 latch/barrier 的调用次数正确,避免死锁或未定义行为。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

472

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

107

2025.12.24

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

107

2025.12.24

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

471

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

158

2023.10.07

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

389

2023.08.14

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.2万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号