“std::thread::thread(const std::thread &)”: 尝试引用已删除的函数

C++ Thread多线程的一个小问题 #include <iostream> #include<thread> #include<vector> #include<algorithm> #include<functional> using namespace std; void func() { cout << "from func: "<<this_thread::get_id()<< endl; } int main() { thr.. 阅读详情

    
class ThreadClass
{
public:
	//void SendUpdatePackage(int stationNum, int &nResult, string &szErrMsg, std::vector<sockaddr_in> &BSAddrVector);
	int Print(int stationnum)
	{
		return stationnum;
	}

private:
	//std::mutex m_SFTPMutex;
};

int main()
{
	std::vector<std::thread> sftpThreadVec;
	int nResult = 0;
	ThreadClass tc;
	for (int i = 0; i < nThreadNum; i++)
	{
		thread my_thread(&ThreadClass::Print, &tc, i);
		sftpThreadVec.push_back(my_thread);
	}
	for (auto &a : sftpThreadVec)
		a.join();
    
    return 0;
}

这里 报错 “std::thread::thread(const std::thread &)”: 尝试引用已删除的函数

查看 thread 源码看到下面这行

thread(const thread&) = delete;

这里是禁用了thread的拷贝构造

而 std::vector 和 std::map 都是要求 类型 必须包含拷贝构造函数

可以这样

	int nResult = 0;
	ThreadClass tc;

	std::thread thArr[4];
	for (int i = 0; i < 4; i++)
	{
		thArr[i] = std::thread(&ThreadClass::Print, &tc, i);
	}

	for (auto &a : thArr)
		a.join();

经验证,这样也可以

	vector<thread> thVec;
	for (int i = 0; i < nThreadNum; i++)
	{
		//sftpThreadArr[i] = thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg);
		thVec.push_back(thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg));
	}

这种写法会报错,先实例化一个 thread对象,然后把这个对象push_back进 vector 会报这个错误

	vector<thread> thVec;
	for (int i = 0; i < nThreadNum; i++)
	{
		//sftpThreadArr[i] = thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg);
		thread ts = thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg);
		thVec.push_back(ts);
	}

 

 

 

C++11 std::thread 深度解析:从基础用法到线程池实战 并发编程是现代软件开发的核心技术之一,旨在通过同时执行多个任务来提升程序性能与响应能力。其基本原理在于利用操作系统提供的线程机制,将任务分解为可并行执行的单元。在C++中,自C++11标准引入的 `std::thread` 库为多线程编程提供了标准化的支持,其技术价值在于简化了线程的创建与管理,使开发者能够更高效地利用多核处理器资源。典型的应用场景包括高性能服务器开发、游戏引擎、并行数据处理以及科学计算等需要大量计算或高并发的领域。本文将聚焦于 `std::thread` 的核心机制,深入探讨其生命周期管理 阅读详情

相关推荐

mot_challenge官方评估代码

mot_challenge官方代码使用介绍 评估mot17验证集:每个视频序列的后一半帧作为验证集 下载源码:git clone https://hub.fastgit.org/JonathonLuiten/TrackEval.git 官网上下载data样例,放在TrackEval/下,结构如下: data |-- gt | |-- bdd100k | |-- davis | |-- kitti | |-- mot_challenge | | |-- MOT15-train |

qq_37866436的博客 4894

函数返回内部变量时报错 error: use of deleted function

问题描述: 为了确保函数返回内部对象时会调用移动构造函数而不是拷贝构造函数,把对象所属类中的默认拷贝构造函数用=delete删除,但是执行时报错 解决方法: 造成问题的原因是对象的内部成员对象不能进行移动构造,比如对象内部有一个mutex成员。 ...

weixin_39849839的博客 7880

手把手教你用CsvView分析大疆无人机飞行日志(附实战CTF题解)

本文详细介绍了如何使用CsvView工具分析大疆无人机飞行日志,包括环境搭建、日志提取、核心功能解析及CTF实战技巧。通过实战案例,帮助读者掌握无人机取证的关键技术,提升日志分析能力,特别适合网络安全竞赛和实际取证场景。

weixin_42652674的博客 456

C++ - error C2280: 尝试引用已删除的函数

一般而言,对象的赋值构造函数如果开发者没有提供,则编译器会生成默认的赋值构造函数。然而,默认的赋值构造函数在以下几种情况会被删除。,那么在拷贝构造对象时,则无法找到构造函数。

Spike的秃头之路 3832

从零构建:基于Docker与FRR的OSPF虚拟网络实验室

本文详细介绍了如何利用Docker与FRR构建OSPF虚拟网络实验室,从环境设计到高级网络拓扑配置,再到实验验证与排错。通过容器化技术实现高效资源利用和快速部署,特别适合网络协议教学、企业网络架构验证等场景。

plum99的博客 221

论文笔记--Spatial-Temporal Fusion Graph Neural Networks for Traffic Flow Forecasting

Summary 在交通预测问题上,现有的框架通常利用给定的空间邻接图和复杂的机制来建模空间和时间关联。作者认为使用给定的空间邻接图会限制模型的有效时空相关性学习,并且它们通常使用单独的模块来实现空间和时间相关性,或者只使用独立的组件来捕获局部或全局的异质依赖关系,割裂了时空依赖关系。为此作者提出一种时空融合图神经网络用于交通预测。提出一种数据驱动的“时间图”生成方法,以此来补偿空间图可能没有反映的相关性。提出一种新的交通预测方法。 Problem Definition 交通预测中的挑战 以上图为

chenxino的博客 1755

c++多线程错误:std::thread::thread(const std::thread &)”: 尝试引用已删除的函数

问题 “std::thread::thread(const std::thread &amp;)”: 尝试引用已删除的函数 解决方案: https://blog.youkuaiyun.com/qiukapi/article/details/104818906

qq_29007291的博客 1186

【AUTOSAR-COM】-2.3_通过PduGroup批量控制CAN Frame/Pdu的接收

-->如果实现类似UDS诊断 $28服务,控制所有APP CAN Rx Frame/Pdu/报文接收; -->自定义过滤CAN信号的接收。

「汽车电子助手」的博客 1989

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

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

jcShan709的博客 15万+

matlab之作图设置游标的精度

matlab画出的figure游标的精度往往是固定的,这就对我们的调试和查看数据造成了不便。 那么怎么修改游标的精度呢? 首先,获取游标dcm_obj = datacursormode(gcf);然后对游标的精度进行设置:set(dcm_obj,'UpdateFcn',@NewCallback)这个NewCallback是什么东西呢?这是一个可以返回游标精度的函数,具体内容如下:function

落日之城 8958

Vue - 简约大气 404 页面

效果图 实现代码 复制即可。 &lt;template&gt; &lt;div&gt; &lt;div class="error"&gt; &lt;!-- 图片可保存到本地 --&gt; &lt;img src="https://img-blog.csdnimg.cn/20210715111039922.png"&gt; &lt;p&gt;抱歉!你访问的页面不存在或已删除 :( &lt;/p&gt; &lt;span class="back" @click="go(

🏆 前端领域优质创作者 3370

C++17中的std::as_const详解

通过,C++17为我们提供了一种更安全、更简洁的方式来处理常量对象的引用。它避免了不必要的类型转换和复制,同时保持了代码的可读性和灵活性。在实际编程中,合理使用可以提高代码的安全性和性能,尤其是在泛型编程和处理只读操作的场景中,它的优势更加明显。希望通过本文的介绍,你能对有更深入的理解,并在自己的项目中充分发挥它的作用。

码事漫谈 1194

YOLO26 vs YOLOv12 vs YOLOv10:工业场景性能实测,速度/精度/部署难度全对比(附完整测试代码)

YOLO26:工业场景全能型选手,无NMS+无DFL设计让部署和推理都省心,小目标精度优势明显,CPU推理速度提升43%,适合大多数生产线场景YOLOv12:中大型目标检测专家,Area Attention在复杂背景下表现出色,适合汽车、家电等大型零部件检测YOLOv10:速度狂魔,GPU上性能领先,轻量化版本适合边缘部署,但小目标精度略逊,适合对实时性要求极高的分拣线场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 623

std::mutex 引起的 C2280 尝试引用已删除的函数

起因是把之前写的类中的 mutex 使用了(之前注释掉了没用到这个变量); 或者说添加了一个 mutex 变量, 然后 这个类有嵌套在了 其类的 map 中使用, 然后 编译 就报错 ` C2280 XXX:XXX(const XXX &amp;) 尝试引用已删除的函数 C2280 XXX::operator=(const XXX &amp;)尝试引用已删除的函数 ` 手动添加 ...

weixin_30646505的博客 1351

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++ Error C2280 尝试引用已删除的函数(二)因std::mutex引起的拷贝

我最近做的项目用到了C++11的多线程库,其中一个类A中有一个类B的成员,而类B的成员中使用到了std::mutex互斥锁,这个互斥锁在B中使用没有任何问题,但是当类B成为一个类A的成员之后,就出现了问题, 1&gt;e:\workqt\spotdetect\detectviewer.cpp(5): error C2280: “Detector::Detector(const Detector &amp;)”: 尝试引用已删除的函数 1&gt;e:\workqt\spotdetect\detector.h(

Basic的个人博客 3007

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++ std::ref与std::cref:安全引用包装与容器存储实践

在C++编程中,引用(reference)作为对象的别名,提供了高效访问数据的能力,但其非对象类型的特性限制了在容器中的直接存储。为了解决这一问题,C++标准库引入了std::reference_wrapper,它通过包装引用使其成为可复制、可赋值的对象类型,从而能够安全地存入std::vector等容器。其核心原理是内部持有一个指针,并通过隐式转换操作符模拟引用行为,同时禁止绑定到右值以避免悬垂引用。这一机制在泛型编程和异步任务处理中尤为重要,例如在std::bind、std::thread传递参数时,使

weixin_32306957的博客 248

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++ std::thread构造函数详解:参数传递、异常安全与实战陷阱

多线程编程是现代软件开发中提升性能的核心技术,它允许程序同时执行多个任务,充分利用多核CPU的计算能力。其基本原理是通过操作系统或语言运行时创建独立的执行流,实现并发处理。在C++中,std::thread是标准库提供的线程管理工具,其价值在于提供了跨平台的线程创建与管理接口,是实现高并发服务、并行计算等场景的基础。理解线程的创建机制,特别是构造阶段的参数传递语义与资源管理,是编写健壮、高效多线程代码的关键。本文聚焦于C++11 std::thread的构造函数,深入剖析其参数传递的‘值’与‘引用’之谜、成

weixin_34302798的博客 384

atomic操作问题——报错error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’

的拷贝构造函数被显式删除,因此不能直接拷贝包含成员的对象。可以通过禁用拷贝构造函数和拷贝赋值运算符,或者实现移动语义来解决问题。如果需要共享对象,可以使用指针或引用。

小墨迹的博客 912

C++引用与const引用深度解析:函数参数与返回值的最佳实践

在C++编程中,引用作为变量的别名,提供了一种高效的对象访问机制。其核心原理是通过绑定到已存在的对象,避免了不必要的拷贝开销,从而提升程序性能。从技术价值看,引用不仅优化了内存使用,还增强了代码的安全性与表达力,尤其在函数接口设计中,能明确传递修改意图。常量引用进一步扩展了这一优势,它创建了只读视图,允许绑定到临时对象并延长其生命周期,这在处理大型对象或需要只读访问的场景中尤为重要。应用场景广泛覆盖函数参数传递、返回值优化以及操作符重载等。本文聚焦于C++引用在函数参数与返回值中的关键应用,结合内存模型与工

cuiji1279的博客 404

C2280 尝试引用已删的函数

项目中某个类,一直报这个错误, struct ModelQueue { int time_delay; std::mutex mutex; // ... }; std::vector&lt;ModelQueue&gt; model_queues; 百思不得起解, 百度之,发现了奥秘。《std::mut...

xinyu391的专栏 3360

01-02-const、static、引用与移动语义 ———— 秋招、实习 小知识点复习

01-02-const、static、引用与移动语义 ———— 秋招、实习 小知识点复习

脑子不好的小菜的博客 200

std::hive:C++26新容器如何实现O(1)删除与稳定引用

在C++容器选型中,开发者常面临性能与稳定性的两难:std::vector缓存友好但中间删除需要搬移数据,std::list删除灵活却牺牲了遍历效率。C++26引入的std::hive(源自plf::colony)带来了全新思路——通过内存块与墓碑标记实现O(1)任意删除,同时保持其他元素的迭代器与引用稳定。其原理是删除时仅标记空洞并复用空闲槽位,插入时优先填充空洞,兼顾连续内存遍历与节点型容器的稳定性。这种设计特别适合游戏ECS、粒子系统、网络连接管理、事件订阅等高频增删且引用需长期持有的场景。相比vec

weixin_34025151的博客 365

C++和标准库速成(九)——引用、const_cast和异常

引用、const_cast和异常

qq_51180928的博客 1183

C++11 std::thread 多线程编程:从基础原理到实战优化

并发编程是现代软件开发的核心概念,它允许程序同时执行多个任务,从而充分利用多核CPU的计算能力,提升系统吞吐量和响应速度。其基本原理是通过操作系统提供的线程机制,创建多个独立的执行流。在C++中,std::thread作为C++11标准库引入的线程管理类,提供了统一、可移植的线程抽象,其价值在于终结了平台相关API的混乱,极大地提升了代码的可移植性。std::thread的设计深刻体现了资源所有权和移动语义,强制开发者明确线程生命周期,以避免资源泄漏。在实际应用场景中,如高性能计算、游戏引擎或服务器开发,s

weixin_30905981的博客 329

C++完美转发:引用折叠与std::forward实现参数无损传递

在C++模板编程中,参数传递的效率与正确性是核心议题。理解值类别(左值、右值)和引用类型是基础,这决定了对象在内存中的生命周期与操作权限。通过引用折叠规则,模板能够推导出参数的原始类型信息,保留其常量性与值类别。这一机制的技术价值在于实现零开销抽象,避免不必要的拷贝,为移动语义提供支持。应用场景广泛,尤其在工厂函数、包装器和通用库设计中,需要将参数原样传递给其他函数。本文以C++的完美转发为例,深入解析如何利用std::forward与转发引用协同工作,确保参数在传递过程中保持其原始特性,从而提升代码的通用

weixin_34290631的博客 357
上一篇: linux 进程日志回滚 用脚本控制
下一篇: c++ string 自己构造string
qiukapi
博客等级 码龄12年 51粉丝 93原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值