当前位置: 首页 > news >正文

c++ barrier 使用详解

c++ barrier 使用详解

std::barrier c++20

  • 头文件 #include <barrier>
  • 作用:一般被用来协调多个线程,在所有线程都到达屏障点之后,才允许它们继续执行,对于需要线程间同步的并行算法和任务来说非常有用。
  • 使用步骤:
    • 创建 barrier 对象,并指定期待计数;
    • 在线程中调用 arrive 或者 arrive_and_wait 方法,使期待计数减一;
    • 当期待计数减为 0 后,即代表所有线程都已到达屏障点,barrier 会解除所有阻塞在屏障点上的线程并重置期待计数。
  • 注意事项:
    • 不同于 latch ,barrier 可重用;
    • 同时调用 barrier 的成员函数,除了析构函数,不引入数据竞争;
    • 在同一个线程中,可以多次减少期待计数;

std::barrier 成员函数

  • arrive:到达屏障并减少期待计数。
  • wait:阻塞当前线程,直至期待计数减为 0。
  • arrive_and_wait:到达屏障并把期待计数减少一,然后阻塞直至期待计数减为 0。
  • arrive_and_drop:到达屏障并把期待计数减少一并使后续阶段的初始期待计数减一。

使用示例

  • 线程 1 和 线程 2 先各自执行一些任务,然后在屏障点上等待直到所有线程抵达后再继续执行后续代码:

    #include <cstdio>
    #include <thread>
    #include <vector>
    #include <barrier>using namespace std::literals;constexpr int num_threads = 2;
    std::barrier barrier(num_threads);
    std::vector<int> v1;
    std::vector<int> v2;void f1()
    {for (int i = 0; i < 2; i++) {v1.push_back(i);// 到达屏障点并阻塞barrier.arrive_and_wait();// 所有线程都到达屏障点后,继续执行printf("v2[%d] = %d\n", i, v2[i]);}
    }void f2()
    {for (int i = 0; i < 2; i++) {v2.push_back(i);// 到达屏障点并阻塞barrier.arrive_and_wait();// 所有线程都到达屏障点后,继续执行printf("v1[%d] = %d\n", i, v1[i]);}
    }int main()
    {std::jthread t1(f1);std::jthread t2(f2);return 0;
    }
    
http://www.lryc.cn/news/230551.html

相关文章:

  • c# 接口
  • 1、NPC 三电平SVPWM simulink仿真
  • JAVA对象列表强转失败,更好的方法
  • 2023最新版本 从零基础入门C++与QT(学习笔记) -5- 动态内存分配(new)
  • asp.net校园招聘管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • flink的键值分区状态自动过期ttl配置
  • 解决Mac配置maven环境后,关闭终端后环境失效的问题(适用于所有终端关闭后环境失效的问题)
  • springboot运行jar包,实现复制jar包resources下文件、文件夹(可支持包含子文件夹)到指定的目录
  • Webpack Bundle Analyzer包分析器
  • SQL-----STUDENT
  • OpenCV入门——图像视频的加载与展示一些API
  • Control的Invoke和BeginInvoke
  • 什么是OpenCL?
  • AdaBoost:提升机器学习的力量
  • Pikachu(皮卡丘靶场)初识XSS(常见标签事件及payload总结)
  • 一则DNS被重定向导致无法获取MySQL连接处理
  • Vue3中如何使用this
  • 7.jvm对象内存布局
  • U-boot(一):Uboot命令和tftp
  • 代码随想录算法训练营第五十三天丨 动态规划part14
  • pdf增强插件 Enfocus PitStop Pro 2022 mac中文版功能介绍
  • uniapp app tabbar 页面默认隐藏
  • 深度学习 YOLO 实现车牌识别算法 计算机竞赛
  • 即时通讯技术文集(第23期):IM安全相关文章(Part12) [共15篇]
  • 为什么UI自动化难做?—— 关于Selenium UI自动化的思考
  • Python小白之“没有名称为xlwings‘的模块”
  • RK3588 学习教程1——获取linux sdk
  • 保护您的Google账号安全:检查和加固措施
  • 「Verilog学习笔记」优先编码器Ⅰ
  • java实现TCP通信(socket)服务端-客户端