19.C++20中的std::latch和std::barrier

文章目录

  • 线程闩std::latch和线程卡std::barrier
    • 线程闩std::latch
    • 线程卡std::barrier的使用
    • 线程闩`std::latch`和线程卡`std::barrier`的区别
      • reference


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


线程闩std::latch和线程卡std::barrier

线程闩std::latch

线程闩std::latchc++20中引入的类,是为了计数std::ptrdiff_t类型的变量。

std::latch中使用的计数器在创建时初始化,线程工作过程中逐渐减少变量的值,直到为零。

std::latch对象中的值不支持重置或修改。

#include <thread>
#include <latch>
#include <vector>
#include <future>
struct my_data
{int x;int y;
};my_data make_data(int i){ return {i, i+1}; }
void do_more_stuff() {}
void process_data(my_data &data, unsigned count) 
{}void foo(){unsigned const thread_count=10;std::experimental::latch done(thread_count);my_data data[thread_count];std::vector<std::future<void>> threads;for(unsigned i=0;i<thread_count;++i)threads.push_back(std::async(std::launch::async,[&,i]{ data[i]=make_data(i);done.count_down();do_more_stuff(); }));done.wait();process_data(data,thread_count);
}int main(int argc, char **argv)
{foo();
}

上面的代码中,先使用std::experimental::latch设置计数的线程数,然后在std::async使用的函数,是lambda表达式,其参数除了i都是通过捕获的方法传递的引用。每个线程任务执行完,会调用.count_down();方法,使得值能够减少,直到为0done.wait();会阻塞进程,等待所有的线程执行结束,std::latch的值变为0为止。

线程卡std::barrier的使用

std::barrier是一个模板类。

线程卡的应用场景如下:

有一组线程在协同处理某些数据,各线程相互独立,分别处理数据,因此操作过程不必同步。但是,只有在全部线程都完成各自的处理后,才可以操作下一项数据或开始后续处理,这时就需要用到std::barrier线程卡。

线程卡的使用是为了同步一组线程。线程在完成自身的处理后,就运行到线程卡处,通过在线程卡对象上调用arrive_and_wait()等待同步组的其他线程。

#include <thread>
#include <vector>
#include <future>#include <barrier>
#include <iostream>
#include <string>
#include <syncstream>void test_barrier()
{const auto workers = {"zhangsan", "zhaosi", "wanger"};auto on_complete = []() noexcept {static auto phase = "...done\n""Cleaning up...\n";std::cout << phase;phase = "...done\n";};std::barrier sync_point(std::ssize(workers), on_complete);auto work = [&](std::string name) {std::string product = "\t" + name " worked.\n";std::osyncstream(std::cout) << product;sync_point.arrive_and_wait();product = "\t" + name + " cleaned.\n";std::osyncstream(std::cout) << product;sync_point.arrive_and_wait();};std::cout << "Starting...\n";std::vector<std::jthread> threadsthreads.reserve(std::size(workers));for(auto const &worker : workers) {threads.emplace_back(work, worker);}
}int main(int argc, char **argv)
{test_barrier();return 0;
}

上例中使用的std::jthread也是新的c++20的特性,相较于std::threadstd::jthread增加了一个方法stop_token,用以实现线程的可控终止,std::jthread 具有一个 std::stop_token,用于发送停止请求给线程的执行。std::stop_token 允许控制线程的终止,如果在线程内部正确处理,可以实现受控的终止。

std::syncstreamC++20 中用于同步输出流的新特性,可以帮助我们在多线程环境下安全地进行输出操作。

线程闩std::latch和线程卡std::barrier的区别

  • 线程闩的意义在于关闸拦截:一旦它进入了就绪状态,就始终保持不变。
  • 线程卡则不同,线程卡会释放等待的线程并且自我重置,因此它们可重复使用。
  • 线程卡只与一组固定的线程同步,若某线程不属于同步组,它就不会被阻拦,亦无须等待相关的线程卡变为就绪
  • std::latch 适用于一次性的同步需求,而 std::barrier 更适合多阶段任务的同步。从上面的例子中可以看到,std::barrier 可以被多次调用,直到控制所有线程多次都到达同步点。

reference

  • 1.https://en.cppreference.com/w/cpp/thread/barrier

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目:71 ssm基于ssm+vue的外卖点餐系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统功能 系统分为前台订餐和后台管理&#xff1a; 1.前台订餐 用户注册、用户登录、我的购物车、我的订单、商品列表 2.后台管理 商品管理&#xf…

QT tableWidget横向纵向设置

横向控件 要设置QTabWidget选项卡的字体方向&#xff0c;可以使用QTabWidget的setTabPosition()方法。通过传递Qt枚举值QTabWidget.east或QTabWidget.west作为参数&#xff0c;可以设置选项卡的字体方向为从左到右或从右到左。 myTabWidget QTabWidget() myTabWidget.setTabP…

Grass手机注册使用教程,利用闲置手机WiFi带宽赚钱

文章目录 Grass是什么&#xff1f; 项目介绍Grasss手机使用步骤第一步&#xff1a;下载狐猴浏览器第二步&#xff1a;注册账户&#xff08;已注册直接跳过&#xff09;第三步&#xff1a;安装Grass Chrome插件1、推荐离线安装2、在线安装 第四步&#xff1a;登录第五步&#xf…

MySQL 更新执行的过程

优质博文&#xff1a;IT-BLOG-CN Select语句的执行过程会经过连接器、分析器、优化器、执行器、存储引擎&#xff0c;同样的 Update语句也会同样走一遍 Select语句的执行过程。 但是和 Select最大不同的是&#xff0c;Update语句会涉及到两个日志的操作redo log&#xff08;重做…

Flutter-excel导入多语言脚本使用步骤

Flutter-excel导入多语言脚本使用步骤 1.下载Node.js brew install node2.输入以下命令来验证Node.js是否已经成功安装&#xff1a; node -v如果一切正常&#xff0c;Node.js应该会显示其版本信息。&#xff08;我这里直接显示了&#xff09; 如果不正常&#xff0c;需要看…

CSS 逻辑属性

css逻辑属性 CSS 逻辑属性与值是 CSS 的一个模块,其引入的属性与值能做从逻辑角度控制布局,而不是从物理、方向或维度来控制。 物理属性(left、right、top、bottom);逻辑属性(start、end) CSS 逻辑属性是一组属性,允许开发人员创建对不同屏幕尺寸和语言响应更快的布…

欧科云链OKLink:坎昆升级后,Layer2项目是否更具竞争力?

在坎昆升级激活之际&#xff0c;OKLink 上线以太坊坎昆升级 Dencun 专题页 &#x1f449; 从专业链上数据分析角度&#xff0c;带来一场充实且即时的 Layer2 数据盛宴。 在近日由 137Labs 发起&#xff0c;Cointime 主持的 Layer2 生态专场讨论中&#xff0c;OKLink 产品…

AndroidStudio插件出现“Compatible with IntelliJ IDEA only“错误时的解决方案

原因:插件比较老&#xff0c;配置可能存在问题 1.修改plugins文件夹下的jar包(插件) 找到AndroidStudio所在位置 打开plugins文件夹,找到需要修改的jar包,通过压缩软件用zip方式打开&#xff0c;找到\META-INF\plugin.xml并编辑&#xff0c;在<version>xxxx</versi…

docker基础(七)之docker start/stop/kill/restart/pause/unpause

文章目录 概述命令速查docker start语法OPTIONS详解&#xff1a; docker stop语法OPTIONS详解&#xff1a; docker restart语法OPTIONS详解&#xff1a;示例和说明 docker kill语法OPTIONS说明&#xff1a; docker pause语法示例 docker unpause语法示例 docker stop 和docker …

InnoDB 缓存

本文主要聊InnoDB内存结构, 先来看下官网Mysql 8.0 InnoDB架构图 MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 如上图所示,InnoDB内存主要包含Buffer Pool, Change Buffer, Log Buffer, Adaptive Hash Index Buffer Pool 其实 buffer pool 就是内存中的…

Python---常用的web框架

Django 特点&#xff1a;Django是一个全功能的Web框架&#xff0c;提供了许多内置的功能和工具&#xff0c;如ORM、表单处理、认证等。它的设计理念是“一切都包含在框架中”&#xff0c;因此适合构建复杂的、大型的Web应用程序。优势&#xff1a;Django具有强大的开发效率和稳…

练习实践-进程回收01-找到并清理僵尸进程

参考来源&#xff1a; https://blog.csdn.net/qq_36528114/article/details/71076110 https://blog.51cto.com/u_12083623/2363384 极客时间-性能优化实战-CPU性能篇 进程回收中的孤儿和僵尸进程的特点 演示环境&#xff1a; 操作系统&#xff1a;Ubuntu18.04 查询工具&#x…

Golang案例开发之gopacket抓包三次握手四次分手(3)

文章目录 前言一、理论知识三次握手四次分手二、代码实践1.模拟客户端和服务器端2.三次握手代码3.四次分手代码验证代码完整代码总结前言 TCP通讯的三次握手和四次分手,有很多文章都在介绍了,当我们了解了gopacket这个工具的时候,我们当然是用代码实践一下,我们的理论。本…

Java 基础学习(二十)Maven、XML与WebServer

1 Maven 1.1 什么是Maven 1.1.1 Maven概述 Maven是一种流行的构建工具&#xff0c;用于管理Java项目的构建&#xff0c;依赖管理和项目信息管理。它使用XML文件来定义项目结构和构建步骤&#xff0c;并使用插件来执行各种构建任务。Maven可以自动下载项目依赖项并管理它们的…

【Sqoop教程】Sqoop学习教程以相关资料

当使用Sqoop进行数据传输时&#xff0c;以下是更详细的步骤和示例&#xff1a; 步骤1&#xff1a;安装和配置Sqoop 下载Sqoop并解压缩到指定目录。配置sqoop-env-template.sh文件&#xff0c;设置JAVA_HOME、HADOOP_COMMON_HOME等环境变量&#xff0c;并另存为sqoop-env.sh。…

PMSM 永磁同步电机滑膜控制 SVPWM矢量控制 matlab simulink 仿真

仿真搭建平台&#xff1a; (1)该模型采用matlab/simulink 2016b版本搭建&#xff0c;使用matlab 2016b及以上版本打开最佳; (2)该模型已经提前转换了各个常用版本&#xff08;最低为matlab2012b&#xff09;&#xff0c;防止出现提示版本过高的情况。 模型截图&#xff1a; 算…

1、goreplay流量回放

目的 在实际项目中&#xff0c;会有大量的回归测试工作&#xff0c;通常会使用自动化代码的手段来实现回归&#xff0c;但是对于一个庞大的系统来说&#xff0c;通过自动化脚本的方式来实现回归测试&#xff0c;又显得很费时费力。并且如果有定期将线上数据同步到测试环境的需求…

【mysql 127错误】mysql启动报错mysqld.service: Failed with result ‘exit-code‘.

无网环境&#xff0c;mysql 安装 出现如下错误 [rootmysql tools]# systemctl status mysqld.service ● mysqld.service - MySQL ServerLoaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since…

XSKY 智能存储,助力“数据要素 X”先进制造

3 月 21-22 日&#xff0c;主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业&#xff0c;星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时&#xff0c;星辰天合先…

防火墙的原理和配置

“防火墙”一词起源于建筑领域&#xff0c;用来隔离火灾&#xff0c;阻止火势从一个区域蔓延到另一个区域。引入到通信领域&#xff0c;防火墙这一具体设备通常用于两个网络之间有针对性的、逻辑意义上的隔离。这种隔离是选择性的&#xff0c;隔离“火”的蔓延&#xff0c;而又…