首页/新闻资讯/正文详情

Linux-线程封装

发布时间:2026/11/11 3:45:46 来源:云帆数科 栏目:资讯中心
Linux-线程封装
摘要本文基于 pthread 从零封装一个 C 线程类 Thread逐步解决类内成员函数作为线程入口导致的编译报错问题通过 static 入口函数配合 this 指针传参完成回调绑定同时引入 _isrunning 标志位控制线程启动状态与 Join 的合法性并借助 syscall(SYS_gettid) 获取线程底层 LWP最终给出可直接复用的完整线程封装代码。我们需要写一个线程封装实现我们自己的一个线程类才能更加深入了解线程#ifndef __THREAD_HPP__ #define __THREAD_HPP__ #includeiostream #includevector #includepthread.h #includestring #includefunctional using func_t std::functionvoid(); //默认名字 const std::string threadnamedefault None-Name; //线程类 class Thread { public: Thread(func_t func,const std::string name threadnamedefault) :_name(name) ,_func(func) {} void* start_routine(void* args) { } void Start() { int n pthread_create(_tid,nullptr,start_routine,nullptr); } void Join() { int n pthread_join(_tid,nullptr); if(n 0) { //等待线程成功 std::cout 等待线程成功 std::endl; } } ~Thread(){} private: pthread_t _tid;//线程ID pthread_t _lwpid;//底层的LWP std::string _name;//线程名字 func_t _func;//线程执行的方法 }; #endif但是这样写会出现波浪号这是因为我们的start_routine是类内函数需要使用this指针可以这样写void* start_routine(Thread* this,void* args)我们也可以这样写static void* start_routine(void* args)因为我们的这个类并没有被实例化所以这个会报错我们也可以把它放到类外面去不过那样比较麻烦因此此时我们就可以传递参数了int n pthread_create(_tid,nullptr,start_routine,this);此时的start_routine就可以改为我们还需要一个标志位来代表线程是否启动bool _isrunning;//线程是否被启动只有当start_routine函数即该类执行的方法开始了才会启动此外如果线程没有启动那么就不能Join//检测线程结束并且回收 void Join() { if(!_isrunning) return; int n pthread_join(_tid,nullptr); if(n 0) { //等待线程成功 std::cout 等待线程成功 std::endl; } }我们现在可以获取线程的LWP需要添加#includeunistd.h #includesys/syscall.h #define get_lwp_id() syscall(SYS_gettid)其实现在这结构已经能够做到基本的操作了主要代码#ifndef __THREAD_HPP__ #define __THREAD_HPP__ #includeiostream #includevector #includepthread.h #includeunistd.h #includestring #includefunctional #includesys/syscall.h #define get_lwp_id() syscall(SYS_gettid) using func_t std::functionvoid(); //默认名字 const std::string threadnamedefault None-Name; //线程类 class Thread { public: Thread(func_t func,const std::string name threadnamedefault) :_name(name) ,_func(func) ,_isrunning(false) { //创建线程成功 std::cout 创建线程成功 std::endl; } static void* start_routine(void* args) { Thread* self static_castThread*(args);//用于接受外部传入的函数参数 //将线程启动 self-_isrunning true; //获取线程ID self-_lwpid get_lwp_id(); //回调我们自己的方法 self-_func(); //返回 pthread_exit((void*)0); } void Start() { int n pthread_create(_tid,nullptr,start_routine,this); //启动线程成功 if(n 0) std::cout 启动线程成功 std::endl; } //检测线程结束并且回收 void Join() { if(!_isrunning) return; int n pthread_join(_tid,nullptr); if(n 0) { //等待线程成功 std::cout 等待线程成功 std::endl; } } ~Thread(){} private: bool _isrunning;//线程是否被启动 pthread_t _tid;//线程ID pthread_t _lwpid;//底层的LWP std::string _name;//线程名字 func_t _func;//线程执行的方法 }; #endif或者Gitee:fthread · 谭旦0000/test_for_csdn - 码云 - 开源中国

相关推荐

ARM 裸机开发(5)——从轮询按键到中断
ARM 裸机开发(5)——从轮询按键到中断

一、轮询方式读按键 板子上有三个按键,中间是复位,左边是低功耗,右边是给用户自己用的试验按键。原理图上开关断开时为高电平,按下为低电平。 按键接在 UART1_CTS_B 这个引脚上,默认功能是串口流控,要把它复… · 2026/11/11 3:45:46

华为OD机试真题 新系统 2026-10-28 C++【日志规则逆波兰转换】
华为OD机试真题 新系统 2026-10-28 C++【日志规则逆波兰转换】

目录 题目 思路 Code 题目 题目内容: 系统中日志采集模块支持用户配置日志过滤规则。为了避免每次匹配都重新解析规则,需要开发一个规则解析器。 给定一个日志规则字符串,实现一个函数,将规则转换成逆波兰表达式(RPN)。 例:输入 A AND (B OR C),输出 A B C OR … · 2026/11/4 11:52:35

基于B/S新员工入职与试用期管理系统的设计与实现【Java毕业设计·安装调试·代码讲解·文档报告】
基于B/S新员工入职与试用期管理系统的设计与实现【Java毕业设计·安装调试·代码讲解·文档报告】

🍊作者:北友舰长 🍊简介:从事计算机毕业设计定制,Java程序开发,可定制化项目、 项目源码、代码讲解、文档撰写、ppt制作等等 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅… · 2026/11/3 13:36:42

盐亭在哪里考电工证内部消息全公开 不怕考不过白交培训费
盐亭在哪里考电工证内部消息全公开 不怕考不过白交培训费

盐亭在哪里考电工证内部消息全公开 不怕考不过白交培训费 怕考不过白交培训费?盐亭电工证报考全攻略来了,内部消息曝光,别再被培训机构忽悠了!… · 2026/11/11 3:45:18

柳州电工证有用吗?证书过期了不知道怎么复审延期怎么办
柳州电工证有用吗?证书过期了不知道怎么复审延期怎么办

柳州电工证有用吗?证书过期了不知道怎么复审延期怎么办 证书过期了不知道怎么复审延期?你不是一个人,这几乎是所有特种作业人员都会遇到的问题。尤其是在柳州,电工证作为从事电气作业的“通行证”,其重要性不言而喻。但很多人在拿到证后,对如何… · 2026/11/11 3:45:18

电工证市安监局发的吗?真实经历告诉你全流程怎么走
电工证市安监局发的吗?真实经历告诉你全流程怎么走

电工证市安监局发的吗?真实经历告诉你全流程怎么走 工地太忙根本没时间复习考试,我当初报名电工证的时候,也是一头雾水,想着找个培训机构搞定一切,结果还是差点被坑。现在回头看看,真得把每个流程走扎实了,才能拿到真正的电工证。今天就从我亲身经历出… · 2026/11/11 3:45:18

电工证等级证取消了吗?郑州报考避坑指南:别让培训费打水漂
电工证等级证取消了吗?郑州报考避坑指南:别让培训费打水漂

电工证等级证取消了吗?郑州报考避坑指南:别让培训费打水漂 怕考不过白交培训费?别慌,电工证等级证并没有取消,只是证书管理方式和考试形式变了。特别是郑州地区,每年都有大量学员因为没选对培训机构、没掌握报考流程,最后花了钱却一无所获。今天就从南… · 2026/11/11 3:45:18

低压电工证年审怎么考?工地太忙根本没时间复习考试,多少钱能搞定?
低压电工证年审怎么考?工地太忙根本没时间复习考试,多少钱能搞定?

低压电工证年审怎么考?工地太忙根本没时间复习考试,多少钱能搞定? 工地太忙根本没时间复习考试,特别是像你这样新乡的应届工程类毕业生,刚入行就遇到低压电工证年审怎么考的问题,真的有点让人头疼。你不是不想考,而是没时间、没精力、不知道从哪下手。… · 2026/11/11 3:45:18

工地太忙根本没时间复习考试?国家电网安监局电工证含金量别浪费了
工地太忙根本没时间复习考试?国家电网安监局电工证含金量别浪费了

工地太忙根本没时间复习考试?国家电网安监局电工证含金量别浪费了 工地太忙根本没时间复习考试,这几乎是每个基层电工、施工人员的真实写照。尤其是像南阳卧龙区这样的建筑大区,工地上电工的需求量大,任务重,很多人压根没时间去准备国家电网安监局电工证… · 2026/11/11 3:44:18

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43

_中职电工证最新政策解读
_中职电工证最新政策解读

中职电工证在哪考?工地太忙根本没时间复习考试的救星来了 工地太忙根本没时间复习考试,这是很多正在备考 中职电工证 的建筑工友的真实写照。你不是不想考,而是真的没时间。但别担心,这期内容是 新乡初次报考人员… · 2026/11/11 0:00:52

昆明电工证培训价格值不值得考?老电工告诉你真相
昆明电工证培训价格值不值得考?老电工告诉你真相

昆明电工证培训价格值不值得考?老电工告诉你真相 之前考的证在外省能不能转过来?这个问题是很多在外地打工、换城市生活、或者是想在昆明发展的朋友最关心的。尤其是现在云南发展快,很多企业都在招持证上岗的电工,如果你手头有证但不在本地,那这个证是不… · 2026/11/11 0:00:52

特种电缆张工网上查询全攻略:外省证如何转过来
特种电缆张工网上查询全攻略:外省证如何转过来

特种电缆张工网上查询全攻略:外省证如何转过来 之前考的证在外省能不能转过来?这是很多特种作业从业者最关心的问题,尤其是像特种电缆张工这类证书,直接关系到日常工作是否合规、能否顺利晋升。很多小伙伴因为证书归属地的问题,陷入职业发展的瓶颈,甚至… · 2026/11/11 0:00:52

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码