发布时间:2026/8/12 15:05:17
基于Linux pthread库模拟实现的线程类 基于Linux pthread库模拟实现的线程类线程类的本质对线程生命周期的控制线程创建线程属性获取线程等待int(void*) 线程v1.0参考void(T)线程v1.1参考线程类的本质无论什么语言的线程类只要它还在当前计算机中运行就必须调用计算机中原有的原生线程库内的接口对线程进行控制。所以所谓的封装使用的还是原生线程但会根据实际需求例如安全、效率等对创建的线程进行控制。这里模仿 C11 的thread类对线程类进行描述希望一个线程有自己的线程ID。希望线程有自己的线程名。用户可能希望查看当前线程的运行状态。线程拥有属于自己的线程函数。线程可由用户决定何时启动。线程运行结束后不建议可选返回自己的返回值。因为函数有void和其他返回值类型这使得功能实现上变得很复杂。其他可选一般情况下不希望线程自己进行隐式构造一个线程。线程支持移动构造但不能支持拷贝构造。对线程生命周期的控制线程创建这里我们希望线程类的对象能根据用户的需求选择是否创建。所以构造函数只会对线程的基本信息赋值对象真正创建线程还需要调用额外的函数这里可设置接口start。若线程启动成功则设置状态runstate为真。线程属性获取这里的线程类的属性有 3 种线程名。线程运行状态。线程 ID 。分别给不同的属性设置接口即可。线程等待线程和进程一样若线程已经退出则默认返回时会被等待。所以可通过设置等待用的接口join通过pthread_join使得主线程等待子线程。若线程状态变量runstate为假则说明等待成功join返回真。否则join所在的线程会进行等待修改等待结果并返回。int(void*)线程v1.0参考mythread.hpp#pragmaonce#includefunctional#includepthread.h#includestringusingstd::string;// 想让线程的主体函数和main函数一样的运行模式namespacemystd{usingfunc_tstd::functionint(void*);templateclassTclassMyThread{public:MyThread(conststringname,func_t fc,T dataT()):_name(name),_func(fc),_data(data),_tid(pthread_t()),_runstate(false){}~MyThread(){}staticvoid*ThreadRoutine(void*args){// 通过类内方法启动进程// 因为原生线程库无法上传包装器MyThread*tsstatic_castMyThread*(args);ts-_func(args);returnnullptr;}boolstart(){if(pthread_create(_tid,nullptr,ThreadRoutine,this)0){_runstatetrue;returntrue;}returnfalse;}booljoin(){// 线程正常退出if(!_runstate)returntrue;// 主动等待线程// 可以获取返回值现在是模型所以不考虑设为nullptrif(pthread_join(_tid,nullptr)0){_runstatefalse;returntrue;}// 等待失败returnfalse;}// getter接口boolrunstate()const{return_runstate;}stringname()const{return_name;}pthread_ttid()const{return_tid;}private:pthread_t _tid;// 线程IDstring _name;// 线程名bool_runstate;// 线程运行状态func_t _func;// 线程本体函数T _data;// 线程类初始数据};}// namespace mystd测试参考#includemythread.hpp// 为使用mt19937#includechrono#includeiostream#includerandom#includeunistd.h#includevectorusingmystd::MyThread;usingstd::cout;usingstd::endl;usingstd::to_string;usingstd::vector;intf(void*args){sleep(1);MyThreadint*mtdstatic_castMyThreadint*(args);coutmtd-name(), 启动endl;// 精度更高的随机数类std::mt19937_64rng(std::chrono::steady_clock().now().time_since_epoch().count());for(inti1,x0;i5;i){xrng()%100001;coutxendl;sleep(1);}return0;}voidf1(){MyThreadintmyThread(thread1,f);if(myThread.start()){cout主线程thread1运行成功, 运行状态myThread.runstate()endl;}else{cout主线程thread1运行失败\n;}if(myThread.join()){cout主线程等待thread1成功, 运行状态myThread.runstate()endl;}else{cout主线程等待thread1失败\n;}}voidf2(){vectorMyThreadintts;for(inti1;i5;i){string nameThreadto_string(i);ts.push_back(MyThreadint(name,f));}for(autox:ts){if(!x.start()){coutx.name()启动异常\n;exit(-1);}sleep(1);}for(autox:ts){if(!x.join()){coutx.name()回收异常\n;exit(-1);}coutx.name()成功回收\n;}}intmain(){f2();return0;}void(T)线程v1.1参考mythread.hpp#pragmaonce#includefunctional#includepthread.h#includestringnamespacemystd{usingstd::function;usingstd::string;// 因为线程函数的返回值从始至终都没有使用// 所以直接上传返回值为void的函数templateclassTusingfunc_tfunctionvoid(T);// 创造一个支持选择参数类型的线程类模板templateclassTclassMyThread{private:pthread_t _tid;// 线程IDstring _name;// 线程名bool_runstate;// 线程运行状态func_tT_func;// 线程本体函数T _data;// 计划上传给线程本体函数的参数public:explicitMyThread(conststringname,func_tTfc,T data):_tid(pthread_t()),_name(name),_runstate(false),_func(fc),_data(data){}~MyThread(){}staticvoid*ThreadRoutine(void*args){// args一般情况下为线程对象MyThread*tstatic_castMyThread*(args);t-_func(t-_data);returnnullptr;}boolstart(){if(pthread_create(_tid,nullptr,ThreadRoutine,this)0){return_runstatetrue;}returnfalse;}booljoin(){if(!_runstate)returntrue;if(pthread_join(_tid,nullptr)0){_runstatefalse;returntrue;}returnfalse;}// getter接口boolrunstate()const{return_runstate;}stringname()const{return_name;}pthread_ttid()const{return_tid;}};}// namespace mystd测试程序#includemythread.hpp#includeiostream#includestring#includevectorusingnamespacestd;usingnamespacemystd;structThreadData{vectorint_arr;int*_sum;ThreadData(vectorintarr,int*sum):_arr(arr),_sum(sum){}};voidadd(void*args){vectorintarrstatic_castThreadData*(args)-_arr;int*sumstatic_castThreadData*(args)-_sum;for(autox:arr)(*sum)x;}intmain(){vectorinta{1,1,4,5,1,4,0,9,0,9,8,1,0};intsum0;ThreadDatadt(a,sum);string ThreadNamet1;MyThreadThreadData*t1(ThreadName,add,dt);if(t1.start()){if(!t1.join())return-1;}coutsumendl;return0;}但若编译器支持 C11 还是建议使用thread。

相关新闻

2026/8/12 15:05:17

AI辅助开发实战:信息安全专业毕业设计高效工程化路径

1. 项目概述:当信安毕设遇上AI辅助开发又到了一年一度的毕业季,对于信息安全相关专业的同学来说,毕业设计(毕设)无疑是大学阶段最具挑战性的综合考核。它不再是对单一知识点的考察,而是要求你将网络攻防、系…

2026/8/12 15:05:17

2026ai站点开发系统有哪些,这几个可千万别错过啦!

2026ai站点开发系统有哪些,这几个可千万别错过啦!艾瑞咨询《2026年中国企.业数字化建站行业白皮书》数据显示,国内AI建站渗透率已破68%,但抽样超1200家中小企业里,仅31%在生成站点后半年仍持续续费且搜索流量正向增长。…

2026/8/12 15:00:16

BilibiliDown终极指南:轻松下载B站视频和高质量音频的完整教程

BilibiliDown终极指南:轻松下载B站视频和高质量音频的完整教程 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_m…

2026/8/12 17:25:33

软件测试全流程实战:从需求分析到自动化与性能测试

1. 项目概述:一次完整的电商系统测试实战最近在带学生做软件测试的课程设计,正好拿TPshop这个开源的B2C电商系统作为实战项目。这个项目标题“农业工程学院-测试需求分析与测试计划自动化性能测试用例报告软件缺陷测试计划单元测试系统测试”看起来像是一…

2026/8/12 17:25:33

Unity3D中int转string的性能优化与实战技巧

1. Unity3D中int转string的常见方法解析在Unity游戏开发中,数据类型的转换是最基础却至关重要的操作。int到string的转换看似简单,但在性能敏感的移动端或大型项目中,不同的实现方式可能带来显著的性能差异。以下是Unity开发中最常用的5种转换…

2026/8/12 17:25:33

AI内容安全过滤:从误报困境到智能分级防御实战

1. 项目概述:当AI安全警报响起最近在折腾一个基于大语言模型的内部知识库问答系统,项目上线前,我们按惯例做了一轮安全压力测试。测试过程本身波澜不惊,但一个意想不到的“插曲”却让我和团队对当前AI安全工具的现状有了更深的思考…

2026/8/12 17:25:33

技术人如何跨越资源鸿沟:构建核心竞争力的实战指南

最近在技术社区和开发者圈子里,一个关于教育公平与职业发展的讨论引起了我的注意。很多同行,尤其是那些凭借自身努力在计算机、电子、自动化等STEM领域站稳脚跟的工程师们,开始担忧一个现象:顶尖大学的优质理工科教育资源&#xf…

2026/8/12 17:25:33

拼多多anti_content参数逆向实战:从JS混淆到Node.js环境构建

1. 项目概述与核心价值最近在分析一些电商平台的数据接口时,拼多多的anti_content参数成了一个绕不开的“硬骨头”。这个参数几乎出现在所有关键的搜索、商品列表和详情请求中,是一道典型的前端反爬防线。网上关于它的分析零零散散,要么语焉不…

2026/8/12 10:37:12

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 5:35:25

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/12 9:34:08

Ubuntu 23.10中双击运行.sh文件的完整指南:从权限原理到桌面配置

1. 项目概述:从一次“双击”引发的权限探索在Ubuntu桌面环境下,我们习惯了双击运行那些带有.exe后缀的Windows程序安装包,但当你拿到一个以.sh结尾的Shell脚本文件时,满怀期待地双击它,却很可能只看到一个文本编辑器窗…

2026/8/12 9:34:08

NumPy条件索引实战:np.where与np.argwhere高效数据筛选指南

1. 从一次数据筛选的“笨办法”说起 前几天,我帮一个刚入行的数据分析师同事看代码,他正在处理一批传感器数据,需要找出所有温度超过阈值的数据点,然后进行后续分析。我一看他的实现,好家伙,一个 for 循环…

2026/8/12 9:34:08

基于Docker与Selenium Grid构建高可用浏览器自动化测试环境

1. 项目概述:为什么需要容器化的浏览器自动化?在软件开发和测试领域,浏览器自动化早已不是新鲜事。无论是日常的UI回归测试、数据抓取,还是复杂的业务流程模拟,Selenium都是我们绕不开的利器。然而,但凡在团…

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/11 17:06:59

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/11 3:05:11

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…