C++并发:线程函数传参(二)
正文
传参中的陷阱
1. 向std::thread 构造函数传参:所有参数(含第1个参数可调用对象)均按值并以副本的形式保存在 std::thread 对象中的tuple里。这一点的实现类似于std::bind。如果要达到按引用传参的效果,可使用std::ref来传递。
2. 向线程函数的传参:由于std::thread 对象里保存的是参数的副本,为了效率同时兼顾一些只移动类型的对象,所有的副本均被std::move到线程函数,即以右值的形式传入。
注意事项
1. 一个实参从主线程传递到子线程的线程函数中,需要经过两次传递。第1次发生在 std::thread 构造时,此次参数按值并以副本形式被保存。第2次发生在向线程函数传递时,此次传递是由子线程发起,并将之前std::thread内部保存的副本以右值的形式(std::move())传入线程函数中的。
2. 如果线程函数的形参为T、const T&或T&&类型时,std::thread的构造函数可以接受左值或右值实参。因为不管是左值还是右值,在std::thread中均是以副本形式被保存,并在第2次向线程函数传参时以右值方式传入,而以上三种形参均可接受右值。
3. 而如果线程函数的形参为T&时,不管是左值还是右值的T类型实参,都是无法直接经std::thread传递给形参为T&的线程函数,因为该实参数的副本会被std::move成右值并传递线程函数,但T&无法接受右值类型。因此,需要以std::ref形式传入
4. 当向线程函数传参时,可能发生隐式类型转换,这种转换是在子线程中进行的。需要注意,由于隐式转换会构造临时对象,并将该对象(是个右值)传入线程函数,因此线程函数的形参应该是可接受右值类型的T、const T&或T&&类型,但不能是T&类型。此外,如果源类型是指针或引用类型时,还要防止可能发生悬空指针和悬空引用的现象。
上面需要注意的第4 点中谈到,这种隐式转换可能会产生临时对象。在之前的描述中关于 std::reference_wrapper 的隐式类型转换,并不涉及临时对象的构造。这里的隐式转换不创建新的对象,而是提供对已存在对象的引用。
我将进一步解释这一点:
std::reference_wrapper 和隐式类型转换
当 std::reference_wrapper<T> 实现隐式类型转换操作符(operator T&() const),它并不创建新的 T 类型的对象。相反,它返回它所包装的现有对象的引用。这是一个重要的区别,因为返回引用意味着没有新对象的构造,只是提供对原始对象的直接访问。
何时会发生临时对象的构造
临时对象的构造通常发生在如下情况:
- 当函数返回一个非引用类型的值时。
- 当创建一个新对象,并使用另一个对象来初始化它时(如复制或移动构造函数调用)。
- 当类型转换需要创建一个新的类型实例时(如从一种复杂类型到另一种类型的转换,如果没有直接的引用传递路径)。
在 std::reference_wrapper 使用的上下文中:
- 不会 创建新的
T类型的对象,因为类型转换操作符返回的是一个已经存在的对象的引用。
结论
因此,在使用 std::reference_wrapper 时,与其隐式转换相关的操作只是提供一个现有对象的引用,而不是创建一个新的对象。这保证了效率和引用的正确传递,是在多线程编程中安全使用对象引用的有效方式。
相关文章:
C++并发:线程函数传参(二)
正文 传参中的陷阱 1. 向std::thread 构造函数传参:所有参数(含第1个参数可调用对象)均按值并以副本的形式保存在 std::thread 对象中的tuple里。这一点的实现类似于std::bind。如果要达到按引用传参的效果,可使用std::ref来传递…...
正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器
前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...
H5 css动画效果
你可以使用 CSS 动画来实现这个效果。下面是一个简单的示例代码,展示了如何使用 CSS 中的关键帧动画来放大然后缩小一张图片,并使动画循环播放: html <!DOCTYPE html> <html lang"en"><head><meta charset&qu…...
创作纪念日(一周年)
机缘 我进入CSDN成为创作者是去年2023年的五月份,当时是在学校报名了蓝桥杯单片机组的比赛,觉得单片机方面有许多精妙之处,并且自学初学单片机实在有许多奇巧的设计点,有许多编程与硬件实际运行需要磨合的地方,这些惊…...
Oracle 数据库全面升级为 23ai
从 11g 到 12c 再到 19c,今天,我们迎来了 23ai ! “ Oracle AI Vector Search allows documents, images, and relational data that are stored in mission-critical databases to be easily searched based on their conceptual content Ge…...
Android WebView打开网址黑屏
1.先说解决方案: // 允许执行JavaScriptbinding.webView.getSettings().setJavaScriptEnabled(true);// 启用硬件加速binding.webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);// 允许混合内容。即使是通过HTTPS加载的页面也可以显示通过HTTP加载的资源。bin…...
软件测试之 接口测试 Postman使用
接口测试 URL HTTP协议 HTTP 请求部分 HTTP响应部分 Postman使用 界面介绍 这里 注意 如果你无法访问 那么 captchaImage这个打错了,给的资料中是错误的地址 https://kdtx-test.itheima.net/api/captchaImage登录接口 科大天下 第一个接口的登录设置 https://kd…...
惠海 H4012 同步降压芯片IC 30V降压3.3V5V12V方案 支持EN使能控制
大家好,今天给大家介绍惠海H4012同步降压芯片IC是一款降压恒压芯片,适用于多种电压转换需求。以下是对该芯片及其30V降压至3.3V、5V、12V方案和支持EN使能控制功能的具体介绍: 首先,H4012是一款内置30V耐压MOS的同步降压型DC-DC转…...
Android Studio查看xml文件的修改时间和记录
Android Studio查看xml文件的修改时间和记录 Android Studio里面如果是Java/Kotlin编写界面,可以点击函数开头上面的提交在直接,然后在编辑界面的左侧查看历史时间上的修改记录,但是xml文件里面没有直观的这样操作方式。 但xml里面可以通过快…...
源码拾贝三则
目录 一 一种枚举类型的新型使用方式 二 Eigen库中的LDLT分解 三 Eigen中的访问者模式 一 一种枚举类型的新型使用方式 ///D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xiosbase enum _Iostate { // consta…...
nginx配置文件和配置命令详解案例
一.nginx.conf配置结构 1.1配置结构图 1.2 nginx中配置nginx.conf配置内容 #user nobody; user root; # 表示worker进程是有root用户去执行的 worker_processes 2; events {# 默认使用epolluse epoll;# 每个worker链接最大数据worker_connections 1024; } http {include …...
服务网关GateWay原理
文章目录 自动装配核心类GatewayAutoConfigurationDispatcherHandler请求处理阶段apply方法httpHandler#handle方法WebHandler#handle方法DispatchHanlder#handle方法第一步 getHandler获取请求映射第二步 invokeHandler 请求适配第三步 handleResult请求处理总结 上一篇博文我…...
第12节 第二种shellcode编写实战(1)
我最近在做一个关于shellcode入门和开发的专题课👩🏻💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考…...
在Ubuntu上安装Anaconda并配置远程访问Jupyter
安装 下载Anaconda的.sh文件后,上传到服务器,然后进行安装: chmod x anaconda.sh ./anaconda.sh创建虚拟环境 可以指定Python版本创建虚拟环境: conda create --name langchain python3.11.7 conda activate langchain conda …...
格雷希尔GripSeal:E10系列低压信号电测试连接器,应用于新能源汽车的DCR测试和EOL测试
新能源车的电驱动、电池包等都有一些信号接口,从几针到几十针不等,而且每种接口都有独特的电性能要求,这些接口在电池包进DCR测试或是EOL测试时,为了满足这些信号接口的需求,我们设计了E10系列信号针快速接头ÿ…...
飞跨电容型的三电平(FC-NPC)逆变器simulink仿真模型
本人搭建了飞跨电容型的三电平逆变器simulink仿真模型,相较于二极管钳位型三电平逆变器而言,钳位二极管变为飞跨的电容。采用SPWM调制和均流均压控制,通过搭建仿真模型得到三电平波形。 三电平拓扑中的飞跨电容是指在电路的输出端使用电容来实…...
前端Sass使用详解,看这篇就够了
Sass(Syntactically Awesome Style Sheets)是一种CSS预处理器,它被设计为改善CSS的可读性和实用性。Sass使用类似于CSS的语法,但增加了变量、嵌套、混合(mixins)、函数等功能,使得编写CSS更加高…...
用js操作dom节点的一些方法
一、获取节点 document.getElementById(id); 返回拥有指定 id 的第一个节点 document.getElementsByName(name); 返回带有指定名称的节点集合 document.getElementsByTagName(tagname); 返回带有指定标签名的节点集合 document.getElementsByClassName(classname); 返回带有…...
electron 中拦截内嵌页面 beforeunload 的弹窗提示
window 的 beforeunload 事件提示在electron 不兼容,弹窗提示不出来,还会导致莫名其妙的假死问题,下面记录一下解决方法。 1. 如果仅需要拦截弹窗: win.webContents.on(will-prevent-unload, (event) > {event.preventDefault(…...
hcip-datacom英文词汇积累简述3
序号 词汇 中文 1 port link-type access 端口链路类型为接入 2 batch 批量 3 vlan batch 2 3 虚拟局域网批量2和3 4 Default 默认 5 port default vlan 2 端口默认虚拟局域网2 6 trunk 主干 7 port link-type trunk 端口链路类型为主干 8 allow-pass 全部过关 9 port trunk al…...
WarcraftHelper终极指南:解锁魔兽争霸3现代硬件潜力的完整方案
WarcraftHelper终极指南:解锁魔兽争霸3现代硬件潜力的完整方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典的即时战…...
LYGIA颜色处理完全教程:28种混合模式与色彩空间转换实战
LYGIA颜色处理完全教程:28种混合模式与色彩空间转换实战 【免费下载链接】lygia LYGIA, its a granular and multi-language (GLSL, HLSL, WGSL, MSL and CUDA) shader library designed for performance and flexibility 项目地址: https://gitcode.com/gh_mirro…...
深入解析PyTorch中.pth文件的保存与加载机制
1. 揭开.pth文件的神秘面纱 第一次接触PyTorch时,看到那些以.pth结尾的文件,你是不是也和我当初一样充满疑惑?这些看似普通的文件,实际上是PyTorch模型持久化的关键。简单来说,.pth文件就像是给AI模型拍的一张"照…...
2026 最强 AI 毕业论文工具盘点:9 款神器帮你告别论文熬夜焦虑
一、引言:毕业季论文困局,AI 工具成破局关键 又到了高校毕业季,屏幕前的你是否正对着空白文档发愁? 开题报告反复修改,导师一句 “方向不明确” 就让你前功尽弃文献综述堆了几十页,却理不清逻辑脉络&…...
WarcraftHelper魔兽争霸插件:5分钟解决老游戏兼容性问题,让经典重获新生
WarcraftHelper魔兽争霸插件:5分钟解决老游戏兼容性问题,让经典重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为…...
大模型提升垃圾邮件识别精度
大模型在垃圾邮件识别与处理中的应用进展与技术优化 问题解构 核心任务识别:问题核心在于了解大模型(Large Language Models, LLMs)在“垃圾邮件识别”这一经典文本分类任务上的最新应用进展,可能包括准确率提升、新技术应用、处…...
AI和苹果夹逼,国产手机顶不住了,网传大规模人才优化已在进行中
某已没落的手机企业在转卖后,近期又传出重大消息,只是这次是相当悲惨的消息,手机硬件研发被砍掉,半数员工就地解散,揭开了手机行业人才优化的序幕,其实手机行业的这种操作早在去年底就已悄然进行࿰…...
用Python处理全球植被数据?手把手教你将BEPS模型的.img文件转成GeoTIFF
从.img到GeoTIFF:Python生态数据处理实战指南 引言:当生态学遇上数据科学 在生态学研究领域,BEPS模型生成的全球植被生产力数据(GPP/NEP/NPP)是理解碳循环和生态系统功能的重要基础。然而,许多研究者第一次…...
在Windows和RV1126上部署ONNX肺部分割模型:一份OpenCV DNN与RKNN的完整对比实践
跨平台肺部分割模型部署实战:OpenCV DNN与RKNN技术选型指南 当医疗影像分析遇上边缘计算,开发者们常常面临一个关键抉择:如何在保证精度的前提下,将训练好的深度学习模型高效部署到不同计算平台?本文将以肺部分割模型为…...
解析 C++ 中的‘生存期保护’:利用生命周期注解规避 99% 的悬挂指针风险
解析 C 中的“生存期保护”:利用生命周期注解规避 99% 的悬挂指针风险尊敬的各位开发者,各位对 C 内存安全孜孜不倦的探索者们,大家好!在 C 的广阔世界中,指针和引用以其强大的能力,赋予了我们对内存的直接…...
