当前位置: 首页 > news >正文

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 时,与其隐式转换相关的操作只是提供一个现有对象的引用,而不是创建一个新的对象。这保证了效率和引用的正确传递,是在多线程编程中安全使用对象引用的有效方式。

http://www.lryc.cn/news/346058.html

相关文章:

  • 正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器
  • H5 css动画效果
  • 创作纪念日(一周年)
  • Oracle 数据库全面升级为 23ai
  • Android WebView打开网址黑屏
  • 软件测试之 接口测试 Postman使用
  • 惠海 H4012 同步降压芯片IC 30V降压3.3V5V12V方案 支持EN使能控制
  • Android Studio查看xml文件的修改时间和记录
  • 源码拾贝三则
  • nginx配置文件和配置命令详解案例
  • 服务网关GateWay原理
  • 第12节 第二种shellcode编写实战(1)
  • 在Ubuntu上安装Anaconda并配置远程访问Jupyter
  • 格雷希尔GripSeal:E10系列低压信号电测试连接器,应用于新能源汽车的DCR测试和EOL测试
  • 飞跨电容型的三电平(FC-NPC)逆变器simulink仿真模型
  • 前端Sass使用详解,看这篇就够了
  • 用js操作dom节点的一些方法
  • electron 中拦截内嵌页面 beforeunload 的弹窗提示
  • hcip-datacom英文词汇积累简述3
  • 什么是新能源汽车热管理?
  • iOS plist文件增删改查
  • docker安装与重装
  • 武汉星起航引领跨境新浪潮,一站式解决方案助力卖家驰骋亚马逊
  • 在做题中学习(56):二维前缀和模板
  • 驾驭多云环境,加速AI创新丨Animbus Cloud 8.3.0 算力调度平台升级发布
  • JavaScript异步编程——02-Ajax入门和发送http请求
  • 湖仓一体 - Apache Arrow的那些事
  • 常用的启发式算法:探索问题解决的智慧之道
  • docker Harbor私有仓库部署管理
  • 序列化的不同格式:JSON、XML、TOML、CSON、YAML