线程池--thread_pool解析

国外的线程池库;

作者:Barak Shoshany (baraksh@gmail.com) (http://baraksh.com)

BS命名空间

Barak Shoshany这个作者的名字简写。

decltype(std::jthread::hardware_concurrency)

concurrency---并发

`std::jthread::hardware_concurrency`是C++20引入的一个新的标准库函数,用于返回当前系统支持的线程并发数(也就是CPU核心数)。这个函数的定义如下:

static unsigned int hardware_concurrency() noexcept;

因此,表达式`std::jthread::hardware_concurrency`的类型是`static unsigned int (*)() noexcept`,它表示一个不接受参数、返回无符号整数、不抛出异常的静态函数指针。将这个类型作为`std::invoke_result_t`模板的参数,就可以获取函数的返回值类型,即`unsigned int`。

std::invoke_result_t<>

std::invoke_result_t`是C++17引入的一个模板,用于获取一个函数或成员指针的返回值类型。

decltype---获取一个表达式的类型或者一个函数的类型

函数的类型包括函数返回值,参数。

std::invoke_result_t---获取一个函数返回值的类型

using priority_t = std::int_least16_t;

这行代码定义了一个类型别名`priority_t`,它表示一个`std::int_least16_t`类型。`std::int_least16_t`是C++标准库中定义的整型类型,表示至少包含16位的带符号整数类型。使用这个类型可以保证变量至少具有指定的位数,从而确保程序在不同平台上的可移植性。例如,如果在某些平台上`short int`类型只有8位(而不是16位),可以使用`std::int_least16_t`来代替`short int`类型,从而避免在不同平台上产生不同的结果。

std::promise<T>----std::future<T>

`std::promise`是C++11标准库中提供的一种同步机制,用于在线程之间共享数据。它通常与`std::future`一起使用,以便在异步操作完成时共享结果。

`std::promise`表示一个可以保存某个类型的值或异常的容器,可以通过调用`set_value`和`set_exception`方法将值或异常传递给与其关联的`std::future`对象。当`std::promise`的值被设置后,可以通过调用`get_future`方法获取一个`std::future`对象,进而获取`std::promise`的值或异常。

std::is_void_v<R>

`std::is_void_v<R>`是一个模板元编程工具,用于检查类型`R`是否是`void`类型的并返回一个布尔值(`true`或`false`)。因此,`std::is_void_v<R>`是一个编译时常量表达式,其值在编译期间确定。

在C++中,类型`void`表示“没有类型”,通常用于表示函数无返回值或指针不引用任何特定类型。当使用模板时,可能需要检查某个类型是否是`void`类型,以根据不同的类型做出不同的决策。这时就可以使用`std::is_void_v<R>`工具来完成这个任务。

class  thread_pool

构造函数

提供给用户的thread_pool类有多构造方式。

但是thread_pool中的真正的thread_pool成员使用thread_pool这个构造函数,用户没有指定则使用默认值。

真正的thread_pool第一个构造参数:线程池;

第二个参数:每一个线程执行之前的初始化函数。

1,无参:默认线程数量===CPU核心数;

2,仅指定线程数量;

3,指定线程数量和线程初始化函数。

成员对象

thread_count----线程池中线程的数量;

threads-----------线程池,jthread对象数组;

std::unique_ptr<std::jthread[]> threads = nullptr;

成员函数

submit_task(task)

task是线程池中线程需要执行的函数,传递函数地址。

wait()

无参,

wait_for(_rel)

wait_until(_abs)

thread_pool创建多个线程

这些线程会同时执行一个传入的任务吗,还是只是一个线程在执行任务?

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

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

相关文章

上海汉得【面试真题】

上海汉得【面试真题】 前言版权一面二面中间件Java基础框架项目反问 最后 前言 2024-5-22 15:39:51 公开发布于 2024-5-24 12:37:10 以下内容源自《【面试真题】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客…

【面试八股总结】索引(二):B+树数据结构、索引使用场景、索引优化、索引失效

参考资料&#xff1a;小林coding、阿秀 一、为什么InnoDB采用B树作为索引数据结构&#xff1f; B 树是一个自平衡多路搜索树&#xff0c;每一个节点最多可以包括 M 个子节点&#xff0c;M 称为 B 树的阶&#xff0c;所以 B 树就是一个多叉树。 B 树与 B 树的差异&#xff1a;…

如何开启tomcat管理功能

1 、修改conf/tomcat-users.xml <role rolename"manager-gui"/> <user username"tomcat" password"tomcat" roles"manager-gui"/>2、修改webapps/manager/META-INF/context.xml <Valve className"org.apache.cata…

遇到了导师放养,该怎么坚持?

最近收到学生读者的留言&#xff0c;抱怨科研的困难。导师忙碌且学生众多&#xff0c;自己只是众多学生之一&#xff0c;常常处于放养状态。除了每周的组会外&#xff0c;几乎无法接触到导师。在这种状态下&#xff0c;缺乏方向和动力&#xff0c;非常担心无法顺利毕业&#xf…

JAVA面试题大全(十八)

1、说一下 jvm 的主要组成部分&#xff1f;及其作用&#xff1f; 类加载器&#xff08;ClassLoader&#xff09;运行时数据区&#xff08;Runtime Data Area&#xff09;执行引擎&#xff08;Execution Engine&#xff09;本地库接口&#xff08;Native Interface&#xff09;…

GDAL读取波段数据1

前面用GDAL输出了一些打开文件的信息; 了解了它的基本的编程方式是, 先注册,执行GDALAllRegister(); 然后打开文件,返回一个数据集指针,即GDALDataset * 类型的指针poDataset; 再通过此指针获取下面各级的信息; 下面来读取打开文件的波段数据,并输出; 首先获得波段…

线程安全 - 笔记

1 程序a调用c.so,程序b也调用c.so c.so加载两次吗? 在这种情况下,通常 c.so 不会被加载两次。 当一个程序调用一个共享对象文件(.so)时,操作系统的动态链接器将该共享对象映射到进程的虚拟内存空间中。后续由不同程序或者同一个程序调用相同的共享对象,都不会导致共享…

力扣:15. 三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

在树莓派3B+中下载opencv(遇到的各种问题及解决)

目录 前言 1、删除原版本下新版本 2、python虚拟环境 3、python版本共存换链接——给版本降低 4、烧录之前版本的文件&#xff08;在清华源中可以找&#xff0c;不用官网的烧录文件就行&#xff1b; 比如&#xff1a;&#xff08;balenaEtcher&#xff09;重新烧录有问题…

Android 编译 C 文件报错 fatal error: ‘jni.h‘ file not found

场景&#xff1a;添加 cpp 文件编译出 so &#xff0c;给 app 使用。 编译报错&#xff0c; packages/apps/XxxApp/jni/native.cpp:22:10: fatal error: jni.h file not found #include <jni.h>^~~~~~~ 1 error generated.缺少声明&#xff0c;类似于 Java 里缺少了 im…

上交提出TrustGAIN,提出6G网络中可信AIGC新模式!

月16日至18日&#xff0c;2024全球6G技术大会在南京召开。会上&#xff0c;全球移动通信标准制定组织3GPP&#xff08;第三代合作伙伴计划&#xff09;的3位联席主席分享了3GPP6G标准时间表&#xff1a; 2024年9月&#xff0c;启动6G业务需求研究&#xff1b; 2025年6月&…

PHP开发入门

PHP官网&#xff1a;PHP: Hypertext Preprocessor apache官网&#xff1a;https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…

一点连接千家银行,YonSuite让“企业付款”更便利

在快速变化的商业环境中&#xff0c;企业的运营效率直接决定了其市场竞争力。特别是对于财务团队来说&#xff0c;每一次付款的流畅与便捷&#xff0c;都是企业高效运作的关键。今天&#xff0c;我们为您带来一个先进性的解决方案——YonSuite&#xff0c;它以其独特的“一点连…

医学中脑机接口技术的未来

医学中脑机接口技术的未来 李升伟 编译 对非侵入性脑机接口&#xff08;而不是植入物&#xff09;日益增长的兴趣可能会提高患者的易使用性&#xff0c;但分辨率需要提高。 图片来源&#xff1a;Denis Pobytov / DigitalVision Vectors / Getty 全球范围内正在展开一场争夺利用…

C++ fcntl 的作用和用法

C fcntl 的作用和用法 fcntl 的作用代码示例代码解释运行结果 fcntl 的作用 fcntl 是一个在 C 和 C 编程中用于操作文件描述符的函数。它提供了多种功能&#xff0c;包括获取和设置文件描述符标志、获取和设置文件锁等。fcntl 函数的原型如下&#xff1a; #include <fcntl…

使用 RT 矩阵进行 3D 点云变换详解(基于 PCL 和 Eigen 库)

在 3D 点云处理中&#xff0c;RT 矩阵是一个常用的工具&#xff0c;用于对点云进行旋转和平移操作。本文将详细介绍 RT 矩阵的概念&#xff0c;并通过一个示例程序演示如何基于 PCL 和 Eigen 库将一帧点云进行矩阵变换再输出。 本教程的示例代码和点云数据可在 GitHub 下载。 什…

多电压档hold扫尾

MMMC下STA收敛更为困难&#xff0c;setup通过DMSA可以很好的得到收敛&#xff1b;但是常规的时序修复工具很难通过工具得到最终clean的时序状态&#xff0c;本文介绍一种多模多角下hold的收敛方法。 该方法主要通过遍历hold路径上多电压setup的余量&#xff0c;支持从前往后和从…

【STM32嵌入式系统设计与开发---传感器拓展】——1_2_蓝牙主从模块_AT配置(HC-05)

一、主机蓝牙设置 # 1、重置模块 ATORGL # 2、设置名字&#xff0c;自己随便设置 ATNAMEMaster # 3、设置连接密码&#xff0c;要和从机一样&#xff0c;密码好像可以不加双引号 ATPSWD"1234" # 4、设置为主机 ROLE 1 为主机 ROLE 0为从机 ATROLE1 # 5、设置波特…

【OpenGL手册14】实例化

目录 一、说明 二、实例化 三、实例化数组 四、小行星带 五、完整代码 六、结论 一、说明 实例化渲染&#xff0c;是用少数数据做模板&#xff0c;实现海量物体渲染的手段方法。用实例化渲染&#xff0c;需要对每个实例产生一定描述数据。如何实现&#xff1f;请看本文下…

用Go实现交替打印数字和字母

引言 在编程的世界里&#xff0c;Go语言以其简洁、高效、并发的特性而广受欢迎。今天&#xff0c;我们将通过一个有趣的小例子——交替打印数字和字母&#xff0c;来一窥Go语言并发编程的魅力。 问题背景 想象一下&#xff0c;我们需要打印一个序列&#xff0c;其中数字和字…