std::thread创建线程,使用std::ref()传递类对象参数

std::ref用法以及和&引用区别 阅读详情

问题描述

一个小的知识点,因为对std:thread不熟悉,刚才写代码出现了一个问题。

void test1(ThreadSafeListTest& tslt)
{
    while (true)
    {
        tslt.thread_safe_list_test1();
    }
}



ThreadSafeListTest test;
std::thread t1(test1, test);  // 这样写,报错

在这里插入图片描述

解决方案

使用 std::ref()即可。

std::thread t1(test1, std::ref(test));

原因是:
thread在使用类对象作为参数传递过程中,常常会出现多次拷贝构造的情况,理想中的情况是只需一次拷贝构造。原因是由于不同编译器对thread函数处理是不同的。

std::ref()详解

参考资料

std::ref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。

  • List item

bind

std::ref主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。

  • thread

其中代表的例子是thread
比如thread的方法传递引用的时候,必须外层用ref来进行引用传递,否则就是浅拷贝。

C++ thread线程函数传参原理剖析 通过C++ Thread类库源码剖析thread线程函数传参原理 阅读详情

相关推荐

C++编程法则365天一天一条(302)std::ref引用包装器

std::ref和std::cref在函数式编程中的作用是非常大的,C++标准库中多次使用到了它们。而std::ref和std::cref事实上是模板函数,返回值是一个std::reference_wrapper对象,而std::reference_wrapper虽然是一个对象,可是他却能展现出和普通引用类似的效果,这点和前一篇文章讲的智能指针如出一辙(事实上标准库大多是这样设计的,这也是运算符重载存在的一个重要意义)。

二进制君 6391

解析C++中std::ref

1. 前言 关于c++中的std::ref,std::ref在c++11引入。本文通过讲解std::ref的常用方式,及剖析下std::ref内部实现,进而再来讲解下std::reference_wrapper,然后我们再进一步分析为什么使用std::ref。 2. std::ref 用法 简单举例来说: int n1 = 0; auto n2 = std::ref(n1); n2++; n1++; std::cout << n1 << std::endl; // 2 std:

leapmotion的博客 1万+

C++笔记之std::move ,std::ref,std::bind

本文简要学习记录。 1、std::move 使用场景如下: (1)c++标准库使用比如vector::push_back等这类函数时,会对参数的对象进行复制,连数据也会复制。这就造成了对象内存的额外创建,本来原意是想把参数push_back进去就可以了。 (2)c++11提供了std::move函数来把左值转换为xrvalue,而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率地使用内存了。 使用前提: (1)定义的类使用了资源并且定义了移动构造函数和移

deep_love1314的博客 1875

c++11 为什么使用ref,和引用的区别

std::ref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。 std::ref主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用 ...

weixin_30695195的博客 367

从OpenClaw到Hermes Agent:AI Agent实战部署与自动化工作流构建

AI Agent(智能体)作为大语言模型(LLM)的能力延伸,其核心原理在于通过工具调用(Tool Calling)与环境交互,使模型从“对话”走向“执行”。这一技术价值在于将自然语言指令转化为具体操作,实现业务流程自动化,从而提升开发与运维效率。在应用场景上,AI Agent广泛适用于自动化运维、智能客服、数据报告生成等重复性任务处理。本文聚焦于两大热门开源框架OpenClaw与Hermes Agent,深入探讨其部署配置、技能扩展及实战联调。通过结合OpenClaw的模块化扩展能力与Hermes Age

weixin_34122810的博客 506

SAP 对接CBS(http方式)

CLEAR:lv_xml_crc32_string. CONCATENATEcrc32_passwordcrc32_keyi_stringINTOlv_xml_crc32_string. CONDENSElv_xml_crc32_string. CALLFUNCTION'SCMS_STRING_TO_XSTRING' EXPORTING text=lv_xml_crc32_string encoding='8400' "GB...

3598

C++多线程编程

创建线程的方法 头文件 #include 线程函数 类对象 线程传递参数 相关函数 mythread.join():阻塞主线程,等待子线程执行完毕; mythread.detach():将子线程与主线程分离,主线程不再等待子线程 std::ref():若要使用引用来改变原来参数,就用std::ref() std::move():并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值...

qq_43749617的博客 172

Ubuntu桌面消失?可能是lightdm配置在捣鬼:详细解析/etc/lightdm.conf的优先级机制与实战修复

本文详细解析了Ubuntu系统因lightdm显示管理器配置错误导致桌面消失的问题。通过分析/etc/lightdm.conf的优先级加载机制,提供了从systemctl诊断、调试模式运行到实战修复配置语法错误(如缺失[Seat:*]组)的完整方案。文章还探讨了在系统无法启动时使用chroot或恢复模式进行高级救援,并对比了lightdm与gdm3在NVIDIA驱动环境下的不同表现,帮助用户高效恢复图形界面。

weixin_29313547的博客 420

C++11 多线程(std::thread)详解

本文介绍了C++11标准库中的std::thread多线程编程基础。

jcShan709的博客 15万+

Aurora 8B/10B IP核介绍 —— Xilinx 技术文档Pg046

一、概述该IP核与用户接口之间支持AXI4-Stream协议,且基于ZYNQ SOC、A7、K7、V7以及UltraScale、UltraScale+系列FPGA的高速收发器(the high-speed serial transceivers)进行实现。多达 16 个连续绑定4 个连续绑定的 GTP 收发器framingstreaming以及全双工或单工加扰消扰CRC校验热插拔Aurora 8B/10B核心(图1-1)是一种可扩展的、轻量级的、用于高速串行通信的链路层协议;

qq_32147275的博客 1640

手把手教你用微信小程序实现智能硬件音视频通话(含Linux/RTOS适配)

本文详细介绍了如何利用微信小程序硬件框架(WMPF)和音视频SDK,在智能硬件(包括Linux与RTOS设备)上实现音视频通话功能。文章从架构设计、设备端SDK集成、小程序VOIP插件开发到跨平台调试与性能优化,提供了全链路实战指南,帮助开发者打通微信小程序与嵌入式设备间的实时音视频通信。

ooo22的博客 331

C++11 thread 参数传递深度解析:为什么需要 std::ref 而非直接引用?

摘要:C++11的std::thread在参数传递时默认采用值拷贝方式,即使线程函数声明为引用参数。这种设计避免了多线程中的悬空引用问题,但也导致无法通过引用修改原始变量或传递不可拷贝对象。std::ref/cref提供解决方案,它们包装引用使其按引用传递,同时在语法上明确标识出潜在的共享数据。本文通过代码示例展示了直接传递引用的陷阱,并解释std::ref如何保留引用语义,同时提醒开发者注意线程安全。

Lion_Long的博客 1916

【HSPiP应用指南】从理论到实践:如何利用汉森溶解度参数优化配方设计

本文深入解析了汉森溶解度参数(HSP)理论及其在配方设计中的核心价值,并详细介绍了如何利用HSPiP软件工具从理论走向实践。文章通过匹配溶解度参数、计算汉森距离(Ra),系统阐述了如何解决溶剂选择、颜料分散稳定性及扩散行为预测等关键问题,并结合界面气相色谱(IGC)等实验方法提升预测精度,旨在帮助配方师实现配方设计的可视化、可量化与高效优化。

weixin_29305313的博客 1650

C++ 多线程(3)std::thread 详解

文章目录一、头文件二、std::thread 构造函数三、其他成员函数四、传递临时参数作为线程对象的注意事项4.1 **解决办法:**4.2 原因分析4.3 总结五、传递类对象、智能指针作为线程参数5.1 修改子线程中的对象,不会影响主线程中的对象5.2 传递智能指针参考链接: 一、头文件 std::thread 在 头文件中声明,因此使用 std::thread 时需要包含 头文件。 二、std::thread 构造函数 (1). 默认构造函数,创建一个空的 thread 执行对象。 (2). 初始

一抹烟霞的博客 1万+

摆脱英文束缚!群晖Transmission4.0.4全新中文界面攻略

在群晖安装完官方Transmission4.0.4套件后,界面是英文状态的,不太好用。但是按照网上分享的原来4.0以前版本的方法更新UI又失败,所以自己搞了下成功了,分享给需要的朋友。

XiaoqiangClub的博客 5217

【温室气体】GOSAT 数据产品

【温室气体】GOSAT 数据产品

WW、forever的博客 238

C++-std::thread之向线程函数传递参数

文章目录向线程函数传递参数 向线程函数传递参数 向线程函数传递参数只需要向std::thread构造函数传递额外的参数即可 std::thread t(hello,arg1,arg2); 需要注意的是,参数会被拷贝到单独的存储空间中,然后作为右值传递给可调用对象。 void f(int i,std::string const& s); std::thread t(f,3,"hello"); 这里"hello"作为const char *传递给构造函数,并且只在新线程的上下文中转换为string类

mrbone11的博客 9657

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++11 std::ref实战指南:如何在std::bind和std::thread中正确传递引用

本文深入解析C++11中std::ref的核心机制与实战应用,重点指导如何在std::bind和std::thread中正确传递引用。通过剖析值语义导致的常见陷阱,并结合代码示例,详细阐述了使用std::reference_wrapper确保函数对象与多线程编程中引用传递有效性的方法,帮助开发者编写正确、高效的C++代码。

nept的博客 631

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

std::thread的常用参数传递总结

实参的生命周期 给std::thread传递参数的时候要注意,参数是引用或者指针的情况下,要注意生命周期的问题 #include <iostream> #include <thread> #include <chrono> #include <fstream> using namespace std::chrono_literals; void func_str(const std::string & str) { std::this_thr

惊鸿一博 3060

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ std::ref————详解

想学习ref,必须先学习reference_rapper 1、是什么? ref是个函数模板: 用来构建一个reference_wrapper对象并返回,该对象拥有传入的elem变量的引用。如果参数本身是一个reference_wrapper类型的对象,则创建该对象的一个副本,并返回。 2、为什么要有ref std::ref主要在函数式编程(如std::bind)时使用,bind是对参数直接拷贝,无法传入引用(即使你传入的实参是引用类型也不行),故引入std::ref()。使用std::ref可以在模板传参

m0_51551385的博客 1万+

std::ref函数

C++11 的std::ref函数就是为了解决在线程的创建中等过程的值拷贝问题,下面将会用一个线程的创建来展示ref函数的作用。 首先我们先来写一个以类对象为参数的线程的创建,先来看一下下面的这个代码: #include <iostream> #include <thread> using namespace std; class A { pub...

Charles_Zaqdt的博客 5060

穿越线程边界的参数迷宫:std::thread参数传递的七种武器

本文深入探讨了C++11中std::thread参数传递的七种关键技术,包括std::ref引用包装器、移动语义、Lambda捕获等,帮助开发者解决线程边界参数传递的常见陷阱。通过分析底层实现原理和性能对比,为高效线程创建和安全参数传递提供了实用解决方案。

weixin_29309213的博客 630

[C++]C++11多线程thread参数传递问题

多线程在很多地方都是必须要掌握的方法,这里先说一下,thread对象的参数传递问题。

FL1768317420的博客 1457

c++_std::thread多线程

c++的thread多线程基础的学习,自查回顾看

前端开发工程师 601

C++11 std::thread 实战:5种线程创建方式与参数传递避坑指南

本文深入探讨了C++11中std::thread的5种线程创建方式与参数传递技巧,涵盖普通函数、成员函数、Lambda表达式等多种实现方法,并详细解析了引用传递、Move-only类型处理等常见陷阱。通过实战代码示例和性能优化建议,帮助开发者掌握现代C++多线程编程的核心技术,提升并发程序开发效率。

weixin_30924087的博客 343

std::thread和pthread的区别 及 传递对象指针和引用

std::thread和pthread的区别 及 传递对象指针和引用引言区别std::thread 如何传递对象 引言 朋友突然问我,pthread和std::thread有什么区别?我不知道他为什么会问到这个问题,但是看到问题后我的第一反应是,你是不是C和C++混学的。 区别 pthread是linux下的多线程API,头文件为pthread.h,关于linux线程和进程区别本篇文章略过,因为本文算是给自学人的科普。 std::thread是c++标准库中的线程库,其意义在于可以跨平台不改代码 因为在wi

Doub1's Blog 5225
上一篇: C++并发编程:线程安全链表
下一篇: 一种轻量的“虚拟机”——Windows 沙盒模式
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值