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…...
EmbBERT架构解析:面向TinyML的革新设计与优化
1. EmbBERT架构解析:面向TinyML的革新设计在边缘计算设备上部署自然语言处理模型一直面临内存和计算资源的双重限制。传统BERT模型即使经过压缩,其2MB版本在TinyNLP基准测试中平均准确率仅为83.93%,且激活内存占用高达1.5MB。EmbBERT通过三大…...
GTX 1660实战AI视频生成:低显存环境下的模型瘦身与帧插值方案
1. 项目概述:在入门级显卡上跑通AI视频生成最近看到不少朋友对AI视频生成很感兴趣,但总被“需要RTX 4090”、“至少24GB显存”这类硬件门槛劝退。作为一个常年混迹于“丐版”硬件圈的老玩家,我决定用我手头这块服役多年的GTX 1660(…...
RT-Thread Sensor框架实战:5分钟搞定INA226电流电压功率监测(含I2C避坑指南)
RT-Thread Sensor框架实战:5分钟搞定INA226电流电压功率监测(含I2C避坑指南) 在嵌入式系统开发中,精准监测电流、电压和功率是许多应用场景的核心需求,无论是电池管理系统、智能硬件功耗分析,还是工业设备状…...
为Claude Code配置Taotoken解决封号与Token不足困扰
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Claude Code配置Taotoken解决封号与Token不足困扰 应用场景类,针对频繁使用Claude Code作为编程助手但受限于官方限制…...
构建个人技能库:从代码片段到可复用技能单元的设计与实践
1. 项目概述:当代码遇上魔法,技能库的构建哲学在软件开发的日常里,我们常常会羡慕那些“魔法师”般的同事:他们似乎总能信手拈来一段代码,优雅地解决一个棘手问题;或者拥有一个私人的“百宝箱”,…...
AD导出Gerber到CAM350拼板全流程避坑指南(附文件漏导出自查清单)
AD导出Gerber到CAM350拼板全流程避坑指南(附文件漏导出自查清单) 在硬件产品开发中,PCB设计到生产的转换环节往往隐藏着诸多"暗礁"。我曾亲眼见过一个团队因为钻孔文件覆盖问题导致生产延误两周,损失近十万元。本文将分…...
如何评估Diem投资价值:代币经济学与估值模型终极指南
如何评估Diem投资价值:代币经济学与估值模型终极指南 【免费下载链接】diem Diem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world. 项目地址: https://gitcode.com/gh_mirrors/di/die…...
开源语言模型项目实践:从Transformer核心到训练调优全解析
1. 项目概述:一个开源语言模型的实践与探索最近在GitHub上看到一个名为“angeluriot/Language_model”的项目,点进去一看,是个挺有意思的语言模型实现。虽然项目标题很简单,但内容却涵盖了从数据处理、模型构建到训练推理的完整链…...
Stagewise:基于Chromium的AI编程浏览器,重塑前端开发工作流
1. 项目概述:一个为开发者而生的“浏览器AI助手”新物种 如果你和我一样,每天的工作流是在浏览器、代码编辑器和终端之间反复横跳,那么你肯定也幻想过:要是能有一个工具,把这三者无缝融合在一起就好了。最近࿰…...
【其他】Obsidian笔记Remotely Save插件中国科技云数据胶囊 配置免费的笔记同步
目录 一 注册中国科技云数据胶囊 二 插件下载 & 配置 三 同步测试 一 注册中国科技云数据胶囊 【1】搜索“中国科技云”,找到“数据胶囊”选项,实名注册可以领取20G的容量: 【2】选择“新数据空间”,输入库的标题…...
