0

0

c++中的std::barrier和std::latch怎么用_c++线程同步工具用法详解

尼克

尼克

发布时间:2025-11-14 19:35:08

|

668人浏览过

|

来源于php中文网

原创

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()。

典型使用场景是主线程启动多个工作线程后,等待它们全部初始化完成。

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

#include 
#include 
#include 

std::latch start_latch(3); // 等待3个线程

void worker(int id) { std::cout << "Worker " << id << " ready.\n"; start_latch.count_down(); // 通知准备完成 }

int main() { std::thread t1(worker, 1); std::thread t2(worker, 2); std::thread t3(worker, 3);

start_latch.wait(); // 等待三个线程都准备好
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "All workers ready, starting...\n";

t1.join(); t2.join(); t3.join();
return 0;

}

std::barrier 的用法

std::barrier 类似于 latch,但支持重复使用。它允许多个线程在某个点“会合”,当指定数量的线程都到达后,才继续执行。与 latch 不同,barrier 可以在每次同步后重置状态。

ChatX翻译
ChatX翻译

最实用、可靠的社交类实时翻译工具。 支持全球主流的20+款社交软件的聊天应用,全球200+语言随意切换。 让您彻底告别复制粘贴的翻译模式,与世界各地高效连接!

下载

常用方法:

  • std::barrier b(count);:创建一个需要 count 个线程参与的 barrier。
  • b.arrive();:通知一个线程已到达,返回一个 arrive_token,可用于后续的 wait。
  • b.arrive_and_wait();:线程到达并等待其他线程同步完成。

barrier 常用于循环并行任务中,比如多线程迭代计算。

#include 
#include 
#include 

std::barrier sync_point(3); int step = 0;

void worker(int id) { for (int i = 0; i < 3; ++i) { std::cout << "Worker " << id << " step " << i << " working...\n";

    // 模拟工作
    std::this_thread::sleep_for(std::chrono::milliseconds(100 * id));

    sync_point.arrive_and_wait(); // 所有线程在此同步
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "All workers completed step " zuojiankuohaophpcnzuojiankuohaophpcn i zuojiankuohaophpcn< "\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。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

线程和进程的区别
线程和进程的区别

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

472

2023.08.10

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

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

131

2025.12.24

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

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

131

2025.12.24

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

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

74

2025.12.31

热门下载

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

精品课程

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

共58课时 | 3.2万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.1万人学习

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

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