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

C++11多线程与线程管理

一、线程基础1.1 thread默认构造函数std::thread::thread()_NOEXCEPT{_Thr_set_null(_Thr);}默认构造函数创建一个空线程对象不关联任何执行线程。1.2 thread带参数构造函数explicitthread(Fn,Args...);可变参数模板可以传入不同的参数组合std::threadt1(func,arg1,arg2);std::threadt2(Class::memberFunc,instance,arg);1.3 拷贝构造函数禁用thread(constthread)delete;// 拷贝构造函数被禁用不允许thread t2 t1;线程对象不可拷贝只能移动。二、线程操作详解2.1 基本操作函数函数说明get_id()获取线程IDjoinable()判断线程是否可joinjoin()等待线程结束并回收资源detach()将线程与主线程分离2.2 join与detach的区别join()特点调用join()后线程不会再被调用主线程会阻塞等待该线程结束join()完成后线程资源被回收std::threadt(func);t.join();// 主线程等待t结束detach()特点分离后的线程称为后台线程主线程退出时其他线程可能未运行完就被迫退出detach后无法再管理该线程detach后不能调用joinstd::threadt(func);t.detach();// 分离线程// 之后无法再管理t2.3 joinable()与move操作std::threadt1(func);std::thread t2std::move(t1);// t1的资源转移到t2// 此时 t1.joinable() false// 对 t1 调用 join 会抛出异常注意对线程调用move后原线程对象变为空壳不能再join。三、线程封装与继承3.1 子类继承模式通过封装thread实现业务逻辑与线程管理的分离classZERO_Thread{public:voidstart(){thread_std::thread(ZERO_Thread::threadEntry,this);}protected:virtualvoidrun()0;// 子类实现具体业务private:voidthreadEntry(){running_true;try{run();// 调用子类的run函数}catch(std::exceptionex){running_false;throwex;}catch(...){running_false;throw;}running_false;}std::thread thread_;boolrunning_false;};流程图start() | v thread_ thread(threadEntry) | v threadEntry() [新线程] | v running_ true | v try { run(); } | v catch (...) [如有异常] | v running_ false四、参数传递注意事项4.1 传入引用需要ref()voidfunc(intx){x10;}inta0;std::threadt(func,std::ref(a));// 必须用ref包装t.join();4.2 传入类成员函数classA{public:voidsetName(conststringname){name_name;}voidfunc4(inta){/* ... */}};A*a4_ptrnewA();a4_ptr-setName(darren);std::threadt4(A::func4,a4_ptr,10);t4.join();deletea4_ptr;4.3 类成员函数重载的处理// 指向void func4(int)的指针std::threadt41((void(A::*)(int))A::func4,a4_ptr,100);// 指向int func4(string)的指针std::threadt43((int(A::*)(string))A::func4,a4_ptr,hello);bind也支持重载std::bind((void(A::*)(int))A::func4,a4_ptr,100);五、互斥量与锁5.1 mutex系列类型说明mutex基本互斥量timed_mutex带超时功能的互斥量recursive_mutex递归互斥量可重入recursive_timed_mutex递归超时基本用法std::mutex mtx;mtx.lock();// 临界区代码mtx.unlock();if(mtx.try_lock()){// 尝试获取锁// ...mtx.unlock();}5.2 lock_guard与unique_locklock_guard特点构造时自动加锁析构时自动解锁不能手动解锁std::lock_guardstd::mutexlck(mtx);// 进入临界区// 离开作用域自动解锁unique_lock特点更灵活可手动解锁支持延迟加锁支持条件变量std::unique_lockstd::mutexlck(mtx);lck.unlock();// 手动解锁// ...lck.lock();// 再次加锁// 支持 scoped_lock 等高级用法对比表特性lock_guardunique_lock自动加锁是是自动解锁是是手动解锁否是条件变量否是开销较小较大六、条件变量6.1 wait机制死等waitstd::mutex mtx;std::condition_variable cv;std::unique_lockstd::mutexlck(mtx);cv.wait(lck);// 一直等待直到被唤醒超时等待wait_forautostatuscv.wait_for(lck,std::chrono::seconds(5));if(statusstd::cv_status::timeout){// 超时退出}else{// 被唤醒}6.2 唤醒操作函数说明notify_one唤醒一个等待的线程notify_all唤醒所有等待的线程示例// 生产者{std::lock_guardstd::mutexlck(mtx);queue.push(data);}cv.notify_one();// 唤醒一个消费者// 消费者std::unique_lockstd::mutexlck(mtx);cv.wait(lck,[]{return!queue.empty();});// 虚假唤醒保护autodataqueue.front();queue.pop();七、原子变量atomic7.1 基本用法#includeatomicstd::atomicintcount(0);// 初始化为0count;// 原子操作count.fetch_add(1);// 显示原子加count.store(10);// 原子写intvalcount.load();// 原子读特点无锁操作保证原子性适用于计数器、标志位等简单变量比mutex效率更高八、异步与future8.1 std::async异步运行std::futureintfstd::async(std::launch::async,func,arg);intresultf.get();// 阻塞等待结果8.2 std::packaged_task将任务与future绑定std::packaged_taskint(int,int)task(add);std::futureintftask.get_future();std::threadt(std::move(task),1,2);t.join();intresultf.get();8.3 std::promise设置值std::promiseintp;std::futureintfp.get_future();p.set_value(42);// 设置值intresultf.get();// 获取三者关系组件作用std::async异步启动任务std::packaged_task绑定任务和futurestd::promise主动设置值九、function、bind与lambda9.1 std::function保存函数#includefunctionalstd::functionint(int,int)func1_;func1_add;// 保存普通函数func1_[](inta,intb){returnab;};// 保存lambda9.2 std::bind绑定函数autofstd::bind(add,1,std::placeholders::_1);intresultf(2);// 相当于add(1, 2)注意占位符从_1开始不是_0可以预先绑定部分参数9.3 lambda表达式autof[](inta,intb)-int{returnab;};intresultf(1,2);十、可变模板参数templateclass...Tvoidf(T...args){// sizeof...(args) 获取参数个数}十一、C11线程池实现11.1 核心结构------------------ | ThreadPool | ------------------ | threads_: 4个 | | taskQueue_ | | mutex_ | | condition_ | ------------------ | -------------------------------------- | | | v v v -------- -------- -------- |thread1 | |thread2 | |thread3 | -------- -------- -------- | | | v v v 从taskQueue_取任务执行11.2 简单实现classThreadPool{public:ThreadPool(intnumThreads){for(inti0;inumThreads;i){threads_.emplace_back([this]{while(true){std::functionvoid()task;{std::unique_lockstd::mutexlck(mtx_);condition_.wait(lck,[this]{return!tasks_.empty();});taskstd::move(tasks_.front());tasks_.pop();}task();}});}}templateclassF,class...Argsautoexec(Ff,Args...args)-std::futuretypenamestd::result_ofF(Args...)::type{usingreturn_typetypenamestd::result_ofF(Args...)::type;autotaskstd::make_sharedstd::packaged_taskreturn_type()(std::bind(std::forwardF(f),std::forwardArgs(args)...));std::futurereturn_typerestask-get_future();{std::lock_guardstd::mutexlck(mtx_);tasks_.push([task](){(*task)();});}condition_.notify_one();returnres;}~ThreadPool(){for(autot:threads_){t.join();}}private:std::vectorstd::threadthreads_;std::queuestd::functionvoid()tasks_;std::mutex mtx_;std::condition_variable condition_;};11.3 使用示例ThreadPoolpool(4);// 执行普通函数autof1pool.exec(add,1,2);// 执行类成员函数A obj;autof2pool.exec(A::func,obj,10);intresultf1.get();// get是阻塞的十二、线程睡眠与ID12.1 睡眠函数函数说明std::this_thread::sleep_for(duration)睡眠指定时长std::this_thread::sleep_until(time_point)睡眠到指定时间std::this_thread::yield()让出CPU时间片12.2 获取线程IDstd::this_thread::get_id();// 获取当前线程IDthread.get_id();// 获取thread对象的线程ID总结C11多线程核心要点类别要点thread不可拷贝可移动join/detach二选一mutexlock/unlock/try_lockRAII用lock_guard/unique_lock条件变量wait/wait_for notify_one/notify_allatomic无锁原子操作适用于简单类型async/future异步任务与结果获取packaged_task任务与future绑定promise主动设置异步结果function/bind函数包装与绑定lambda匿名函数对象线程池生产者-消费者模式任务队列根据零声教育教学写作https://github.com/0voice

相关文章:

C++11多线程与线程管理

一、线程基础 1.1 thread默认构造函数 std::thread::thread() _NOEXCEPT {_Thr_set_null(_Thr); }默认构造函数创建一个空线程对象,不关联任何执行线程。 1.2 thread带参数构造函数 explicit thread(Fn &&, Args &&...);可变参数模板,可…...

为什么你的课程推荐越来越不准?Perplexity查询功能2024Q2算法升级内幕(附绕过冷启动限制的私有指令)

更多请点击: https://kaifayun.com 第一章:为什么你的课程推荐越来越不准?Perplexity查询功能2024Q2算法升级内幕(附绕过冷启动限制的私有指令) Perplexity 在 2024 年第二季度对课程推荐核心查询模块进行了深度重构&…...

【2026】知云文献翻译安装使用指南:学术PDF划选即译,研究生必备工具

读英文文献最烦的不是词汇,是格式。复制到翻译软件,格式全乱、公式变问号、图注和正文混在一起。知云文献翻译的解法是直接在PDF里划选翻译,格式不动,原文译文左右对照,不用来回切换窗口。 这篇从安装到核心功能配置一…...

短视频矩阵管理实战:从手工操作到AI全链路自动化的技术演进

一、问题场景:矩阵运营为什么这么累? 做过短视频矩阵的团队,几乎都踩过同一个坑: 痛点真实数据5个平台 10个账号 每天手动发布50次耗时 3~4 小时/天视频素材分散在本地硬盘、网盘、微信群找一个素材平均 8 分钟私信/评论分散在…...

终极指南:如何快速上手BOTW-Save-Editor-GUI塞尔达传说存档编辑器

终极指南:如何快速上手BOTW-Save-Editor-GUI塞尔达传说存档编辑器 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI BOTW-Save-Editor-GUI是一款专为《塞…...

CircuitJS1:浏览器中的电子电路仿真神器完全指南

CircuitJS1:浏览器中的电子电路仿真神器完全指南 【免费下载链接】circuitjs1 Electronic Circuit Simulator in the Browser 项目地址: https://gitcode.com/gh_mirrors/ci/circuitjs1 想要学习电子电路却苦于没有实验设备?需要验证电路设计却不…...

魔兽争霸3终极优化指南:如何用WarcraftHelper实现高帧率宽屏体验

魔兽争霸3终极优化指南:如何用WarcraftHelper实现高帧率宽屏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为…...

MySQL 8.3远程连接踩坑记:Navicat提示caching_sha2_password错误的完整修复流程

MySQL 8.3远程连接认证插件问题深度解析与实战修复指南 1. 问题现象与背景分析 那天下午,当我正尝试用Navicat Premium 16连接新部署的MySQL 8.3数据库时,屏幕上突然弹出的红色错误框让我的咖啡杯悬在了半空: Authentication plugin caching_…...

C AI 编程助手:助力开发者高效编程

C AI 编程助手:助力开发者高效编程 引言 随着人工智能技术的飞速发展,编程领域也迎来了新的变革。C AI 编程助手作为一种新兴的智能编程工具,旨在帮助开发者提高编程效率,降低开发成本。本文将详细介绍C AI 编程助手的功能、优势以及应用场景,帮助开发者更好地了解这一创…...

【锂离子电池组的被动式电池均衡】电池组由两个并联的串联电池组成,每个并联串联都包含四个串联电池,目标是通过在电阻器上放电高SOC电池,直到所有电池的SOC相等附Simulink仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

初次接触Taotoken的新手如何从注册到完成第一次API调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次接触Taotoken的新手如何从注册到完成第一次API调用 对于初次接触大模型API的开发者而言,从注册平台到成功发出第一…...

最新彩虹云商城重构版 虚拟商城 在线下单 自动发货

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 彩虹云商城重构版 【重构】数据面板显示样式和布局 【优化】一级分类提示,更加详细,添加对模板导航引入说明 【优化】系统概览页面 【优化】供货商商品列表显示…...

基于雪崩晶体管设计2ns快速边沿脉冲发生器:原理、实现与调试

1. 项目概述与核心价值在射频、高速数字电路测试,甚至是核物理、激光雷达的前沿实验中,我们常常会遇到一个令人头疼的问题:市面上能买到的标准脉冲信号源,其输出脉冲的上升时间(Rise Time)往往在几十纳秒甚…...

3种高级策略突破AI编辑器限制:Cursor Pro逆向工程技术解析

3种高级策略突破AI编辑器限制:Cursor Pro逆向工程技术解析 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your…...

告别依赖冲突!用iframe集成file-viewer预览Word/PPT,Vue2项目也能轻松升级

告别依赖冲突!用iframe集成file-viewer预览Word/PPT,Vue2项目也能轻松升级 在Vue2项目中集成第三方文件预览组件时,开发者常常陷入依赖地狱——npm包版本冲突、构建体积膨胀、升级路径断裂等问题接踵而至。本文将揭示一种被低估的轻量级解决方…...

Mos:三步解决Mac鼠标滚动卡顿,免费享受触控板般丝滑体验

Mos:三步解决Mac鼠标滚动卡顿,免费享受触控板般丝滑体验 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction in…...

题解:洛谷 U327333 Max Sum Plus Plus 2

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...

BiliBiliToolPro:解放双手的B站自动化神器,让你的账号管理从未如此轻松

BiliBiliToolPro:解放双手的B站自动化神器,让你的账号管理从未如此轻松 【免费下载链接】BiliBiliToolPro B 站(bilibili)自动任务工具,支持docker、青龙、k8s等多种部署方式。全面拥抱AI。敏感肌也能用。 项目地址:…...

FPGA系统时钟革新:纯硅可编程振荡器提升可靠性与设计灵活性

1. 项目概述:为什么FPGA需要一个更“稳”的时钟?在FPGA(现场可编程门阵列)的设计与应用中,时钟信号就像是整个数字系统的“心跳”。无论是高速数据采集、复杂算法处理,还是多协议通信,一个稳定、…...

3分钟掌握BilibiliDown:您的专业B站视频离线下载解决方案

3分钟掌握BilibiliDown:您的专业B站视频离线下载解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirror…...

如何快速掌握League-Toolkit:英雄联盟玩家的终极辅助工具指南

如何快速掌握League-Toolkit:英雄联盟玩家的终极辅助工具指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一款…...

Steam账号被盗,手机邮箱都失效?别慌!我用支付宝账单截图成功找回(附详细客服案件创建流程)

Steam账号终极找回指南:当手机邮箱全失效时的支付宝账单申诉法 凌晨三点,盯着屏幕上"未找到关联账户"的红色提示,手指在键盘上悬停了十分钟——这是许多Steam玩家遭遇账号全维度被盗时的真实噩梦。当盗号者不仅修改了密码&#xf…...

Claude Code 2026 路线图深度拆解:5 大新增能力与企业级项目落地时间表

1. 5 大新增能力不是“功能列表”,而是上下文治理的5个切口 大多数人看到「Claude Code 2026 路线图」的第一反应,是去官网截图那张带箭头和时间轴的PPT——然后立刻开始评估“哪个功能我团队下周就能用上”。我试过。去年Q4我们团队在三个项目里并行接入了路线图中已发布的…...

FanControl完全指南:5步打造Windows风扇智能控制系统

FanControl完全指南:5步打造Windows风扇智能控制系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…...

手把手教你用Docker Compose部署Jitsi Meet视频会议,并解决“断开链接”的坑

从零构建高可用Jitsi Meet视频会议系统:Docker Compose实战与深度排错指南 在远程协作成为常态的今天,搭建自主可控的视频会议系统已成为许多技术团队的基础需求。Jitsi Meet作为开源的WebRTC视频会议解决方案,凭借其出色的音视频质量和灵活的…...

用HyperLynx VX2.5做LPDDR4X与高速串行总线仿真的完整工作流

HyperLynx VX2.5实战:LPDDR4X与高速串行总线仿真全流程解析 在当今高速电路设计领域,信号完整性问题已成为制约产品性能的关键瓶颈。尤其对于搭载LPDDR4X内存和高速串行总线的移动设备与服务器,工程师们常常陷入这样的困境:设计阶…...

别再纠结选哪种了!一文讲透无人机测深三剑客(激光雷达/测深仪/GPR)的实战选型指南

无人机测深技术三剑客:激光雷达、测深仪与探地雷达的深度选型指南 当无人机遇上水深测量,技术选型往往成为项目成败的关键。在河道整治、水库清淤、海岸线测绘等场景中,工程师们常面临一个核心难题:如何在激光雷达、测深仪和探地雷…...

告别文档踩坑:手把手教你用OkHttp和Gson解析OneNET API返回的复杂JSON数据

告别文档踩坑:手把手教你用OkHttp和Gson解析OneNET API返回的复杂JSON数据 在Android开发中,处理网络请求和JSON数据解析是每个开发者都必须掌握的基本技能。然而,当面对像OneNET这样的物联网平台返回的复杂嵌套JSON结构时,即使是…...

ChromaControl终极指南:如何用一个软件控制所有RGB设备?[特殊字符]

ChromaControl终极指南:如何用一个软件控制所有RGB设备?🎮 【免费下载链接】ChromaControl 3rd party device lighting support for Razer Synapse. 项目地址: https://gitcode.com/gh_mirrors/ch/ChromaControl 你是否厌倦了桌面上堆…...

不只是F5隐写:一次CTF解题,带你深入理解ZIP伪加密的底层原理与手动修复

深入解析ZIP伪加密:从CTF实战到二进制手动修复 在CTF竞赛中,ZIP伪加密一直是Misc类题目的经典考点。不同于常规的加密破解,伪加密巧妙地利用了ZIP文件格式的设计特性,在不实际加密数据的情况下制造出需要密码的假象。本文将带您深…...