vs2019 cpp20 规范的线程头文件 <thread> 注释并探讨两个问题

(1)学习线程,与学习其它容器一样,要多读 STL 库的源码。很多知识就显然而然的明白了。也不用死记硬背一些结论。上面上传了一份注释了一下的 源码。主要是补充泛型推导与函数调用链。基于注释后的源码探讨几个知识点。 STL 库的多线程,从语言上支持多线程编程,屏蔽了操作系统上的内核函数差异。
(2)结论一 : 能作为线程中的函数执行,该函数的形参应是值传递,或者是右值引用;不能是左值引用,否则编译不通过。举例如下图:

在这里插入图片描述

函数形参是左值引用则直接报错:

在这里插入图片描述

(3) 为什么会如此呢?这要从 STL 库的源码开始。虽然我理解的不深,欢迎一起探讨。首先看下 thread 类的数据结构:

在这里插入图片描述

接着要看看 thread 的构造函数:

在这里插入图片描述

接着进入 STL 中的源码:

在这里插入图片描述

接着看下在 thread 里是如何处理传递给待执行函数的实参的。从上图也可以看出,STL 用 tuple 元组来存储实参,但先用 decay_t 模板对实参的类型进行了处理。 decay 英文意思是衰减,消退,在代码里的含义,结合其定义,就是去除实参类型上的各种修饰符,只保留关于实参的最基本的类型(这就导致了实参向形参的值传递),decay_t 的定义如下(c++ 学习的难点就在于泛型推导,语法规则不多,但运用语法自洽的编写大型的具有功能的程序段,就难了):

在这里插入图片描述

decay 需要的其它模板定义:

在这里插入图片描述

以及:

在这里插入图片描述

所以可见,在 thread 中构建的 tuple 元组,将只包含最基本的不含引用 ,const ,volatile 等修饰符的类型。
接着在这一行代码里构建元组,并用实参对其初始化,并用独占智能指针指向这个新创建的 tuple 元组,其实这个元组就是将来线程执行时 的形参值,这些也作为函数中的局部变量的形参在内存中的位置。所以可以得出结论,线程中的函数,其形参是独一无二的,与 main 函数中创建线程时传递的实参没有任何关系。但 线程中待执行函数的形参,虽已生成数据,但这些形参无名,只有地址。其符合右值引用的定义与值传递的定义,但唯独不符合左值引用的定义。左值引用要求引用的值已经有名称,可是 tuple 中这些新生成的数据,留给将来待执行函数的形参使用,还不具有名字。用左值引用引用这些数据是非法的。这就要求待执行的函数形参应该如何写,应符合相关语法语义的格式。这符合我们以前学习的知识。

在这里插入图片描述

下面给出 _Get_invoke ,该函数很简单,就是给出线程中待执行函数的起始地址:

在这里插入图片描述

接着附上关于 全局 invoke 的源码与注释,很长,仅供参考。咱们还是要结合源代码,图片只是示意:

在这里插入图片描述

以及其它辅助理解的注释:

在这里插入图片描述

以及:

在这里插入图片描述

至此,咱们基本清楚了线程中待执行函数的启动流程,准备过程,以及函数形参是如何产生的。谢谢阅读。

(4)接着谈下第二个知识点:涉及线程中待执行函数的形参的生存周期。显然,函数形参的生存周期可能很长,是伴随线程存在,伴随其函数存在的。但这些形参数据是在 thread 这个类的构造函数执行时分配到内存的。显然独占指针 _Decay_copied 指向的存储形参数据的 tuple 元组,不应随着 _Decay_copied 这个智能指针的生存周期结束而到期。这是从以下代码发现出来的:

在这里插入图片描述

以下给出独占指针的相关成员函数的定义:

在这里插入图片描述

谢谢阅读。剩余的 join ,detach 结合源码就好理解了。很短的源代码。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

上位机图像处理和嵌入式模块部署(树莓派4b的软件源)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多文章都建议替换一下树莓派4b的软件源,不过我自己实际使用下来,官方的软件下载速度其实还可以。这里下载的时候&#xf…

mybatis-plus使用指南(1)

快速开始 首先 我们 在创建了一个基本的springboot的基础框架以后&#xff0c;在 pom文件中 引入 mybatisplus的相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5…

猫头虎分享已解决Bug || 已解决ERROR: Ruby Gems安装中断 ⚠️ Bug 报告:Gem::RemoteFetcher::FetchError

猫头虎分享已解决Bug || 已解决ERROR: Ruby Gems安装中断 ⚠️ Bug 报告&#xff1a;Gem::RemoteFetcher::FetchError 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; …

树莓派安装opencv

安装opencv 上述步骤完成后&#xff0c;输入以下代码(基于python3) sudo apt-get install python3-opencv -y不行的话&#xff0c;试试换源&#xff0c;然后 sudo apt-get update成功&#xff01; 测试opencv是否安装成功 输入 python3 然后再输入 import cv2 没有报错就…

java jdk1.8下载与安装

一、下载 1.下载jdk1.8安装包 官网下载地址&#xff1a;Java Downloads | Oracle 打开官网链接&#xff0c;下滑至Java 8模块&#xff0c;选取自己电脑适合的版本点击下载 二、安装 1.找到我们下载的安装包&#xff0c;双击运行 2.点击下一步 3.点击更改&#xff0c;修改安…

字典是如何实现的?Rehash 了解吗?

字典是 Redis 服务器中出现最为频繁的复合型数据结构。除了 hash 结构的数据会用到字典外&#xff0c;整个 Redis 数据库的所有 key 和 value 也组成了一个 全局字典&#xff0c;还有带过期时间的 key 也是一个字典。(存储在 RedisDb 数据结构中) 字典结构是什么样的呢&#xf…

Linux重定向及缓冲区理解

重定向&#xff1a; 在上一期虚拟文件系统中讲到了每个进程在打开后&#xff0c;都会默认打开3个文件&#xff0c;如下&#xff1a; stdin 标准输入&#xff08;键盘&#xff09; 文件描述符&#xff1a;0 stdout 标准输出&#xff08;显示器&#xff09;文件描述符&a…

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是&#xff1f; 实际利润目标利润&#xff08;目标成本-实际成本&#xff09;*卖方分担比例 解&#xff1a;10 000&#xff08;100 000 - 90 000&#xff09;* 0.2 12 000&#xff08;元&#xff09; 实际成本有时也写作最终成本&#xff0c;问承…

XYCTF - web

目录 warm up ezMake ezhttp ezmd5 牢牢记住&#xff0c;逝者为大 ezPOP 我是一个复读机 ezSerialize 第一关 第二关 第三关 第一种方法&#xff1a; 第二种方法&#xff1a; ez?Make 方法一&#xff1a;利用反弹shell 方法二&#xff1a;通过进制编码绕过 ε…

logback日志持久化

1、问题描述 使用logback持久化记录日志。 2、我的代码 logback是Springboot框架里自带的&#xff0c;所以只要引入“spring-boot-starter”就行了。无需额外引入logback依赖。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns&…

班级综合测评|基于Springboot+vue的班级综合测评管理系统(源码+数据库+文档)

目录 基于Springbootvue的“智慧食堂”系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

(Java)心得:LeetCode——18.四数之和

一、原题 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; …

环境变量(全)

概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可以链接成功&#xff0c;生成可执…

韩顺平0基础学Java——第10天

p202-233 类与对象&#xff08;第七章&#xff09; 成员方法 person类中的speak方法&#xff1a; 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak&#xff08;&#xff09;中&#xff0c;speak表示方法名&#xff0c;括号是形参列表。 4.大括号为方法体&am…

Oracle 流stream数据的复制

Oracle 流stream数据的复制 --实验的目的是捕获scott.emp1表的变化&#xff0c;将变化应用到远程数据库scott.emp1表中。 --设置初始化参数 AQ_TM_PROCESSES1 COMPATIBLE9.2.0 LOG_PARALLELISM1 GLOBAL_NAMEStrue JOB_QUEUE_PROCESSES2 --查看数据库的名称&#xff0c;我的为o…

Unity图形图表XChart插件使用

最近做了一款数字孪生项目,其中涉及到了图形图表的应用,网上找了一下,找到了XChart插件,使用起来蛮方便的,不过还有待继续研究,很多细节性的知识点需要进行学习探索。以下是项目中的应用。 官方应用: ![](https://img-blog.csdnimg.cn/direct/ab9de8e84e7b4be4a50ea…

【UnityRPG游戏制作】Unity_RPG项目_PureMVC框架应用

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

Google与哈佛大学的科学家团队共同创造了一张人脑中一个极小部分的精细地图

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《为什么伟大不能被计划》对创意、创新和创造的自由探索 - 三余书屋 3ysw.net

为什么伟大不能被计划&#xff1a;对创意、创新和创造的自由探索 大家好&#xff0c;今天我们要讲述的书是由肯尼斯斯坦利和乔尔雷曼撰写的《为什么伟大不能被计划》&#xff0c;副标题是“对创意、创新和创造的自由探索”。光听这两位作者的名字&#xff0c;斯坦利和雷曼&…

鸿蒙开发接口Ability框架:【(AbilityContext)】

AbilityContext AbilityContext是Ability的上下文环境&#xff0c;继承自Context。 AbilityContext模块提供允许访问特定于ability的资源的能力&#xff0c;包括对Ability的启动、停止的设置、获取caller通信接口、拉起弹窗请求用户授权等。 说明&#xff1a; 本模块首批接口…