news 2026/8/12 18:41:46

【Linux】使用C++对线程进行封装

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux】使用C++对线程进行封装

这里直接看代码就行:

第一个版本:

#pragma once #include <iostream> #include <functional> #include <pthread.h> namespace ThreadModule { static int gnumber = 1; using callback_t = std::function<void ()>;//重点 enum class TSTATUS//线程状态 { THREAD_NEW, THREAD_RUNNING, THREAD_STOP }; std::string StatusString(TSTATUS s) { switch (s) { case TSTATUS::THREAD_NEW: return "THREAD_NEW"; case TSTATUS::THREAD_RUNNING: return "THREAD_RUNNING"; case TSTATUS::THREAD_STOP: return "THREAD_STOP"; } return nullptr; } std::string isJoin(bool joinable) { return joinable ? "true" : "false"; } class Thread { private: void ToRuning() { _status = TSTATUS::THREAD_RUNNING; } void ToStop() { _status = TSTATUS::THREAD_STOP; } static void* ThreadRoutine(void* args)//static : 取消 this 指针对该函数的干扰 { Thread *self = static_cast<Thread*>(args); pthread_setname_np(self->_tid,self->_name.c_str());//设置线程名 self->_cb(); self->ToStop(); return nullptr; } public: Thread(callback_t cb) :_tid(-1),_status(TSTATUS::THREAD_NEW),_joinable(true),_cb(cb),_result(nullptr) { _name = "Thread_" + std::to_string(gnumber++); } ~Thread() {} bool Start() { int n = pthread_create(&_tid,nullptr,ThreadRoutine,this); if(n != 0) return false; ToRuning(); return true; } void Join() { if (_joinable) { int n = pthread_join(_tid, &_result); if (n != 0) { std::cerr << "join error: " << n << std::endl; return; } (void)_result; _status = TSTATUS::THREAD_STOP; } else { std::cerr << "error, thread join status : " << _joinable << std::endl; } } void Detach() { if(_status == TSTATUS::THREAD_RUNNING && _joinable) { pthread_detach(_tid); _joinable = false; } else std::cout << "detach " << _name << "failed" << std::endl; } void Stop() { } void Die() { if(_status == TSTATUS::THREAD_RUNNING) { pthread_cancel(_tid); _status = TSTATUS::THREAD_STOP; } } void PrintInfo() { std::cout << "thread name: " << _name << std::endl; std::cout << "thread _tid: " << _tid << std::endl; std::cout << "thread _status: " << StatusString(_status) << std::endl; std::cout << "thread _joinable: " << isJoin(_joinable) << std::endl; } private: std::string _name; pthread_t _tid; TSTATUS _status; bool _joinable; callback_t _cb;//用户自定义线程的执行函数 void* _result;//线程的退出信息 }; } // namespace ThreadModule

第二个版本:

#pragma once #include <iostream> #include <functional> #include <pthread.h> namespace ThreadModule { static int gnumber = 1; template<class T> using callback_t = std::function<void (T&)>;//重点 enum class TSTATUS//线程状态 { THREAD_NEW, THREAD_RUNNING, THREAD_STOP }; std::string StatusString(TSTATUS s) { switch (s) { case TSTATUS::THREAD_NEW: return "THREAD_NEW"; case TSTATUS::THREAD_RUNNING: return "THREAD_RUNNING"; case TSTATUS::THREAD_STOP: return "THREAD_STOP"; } return nullptr; } std::string isJoin(bool joinable) { return joinable ? "true" : "false"; } template<class T> class Thread { private: void ToRuning() { _status = TSTATUS::THREAD_RUNNING; } void ToStop() { _status = TSTATUS::THREAD_STOP; } static void* ThreadRoutine(void* args)//static : 取消 this 指针对该函数的干扰 { Thread<T> *self = static_cast<Thread<T>*>(args); pthread_setname_np(self->_tid,self->_name.c_str());//设置线程名 self->_cb(self->_data); self->ToStop(); return nullptr; } public: Thread(callback_t<T> cb,const T& data) :_tid(-1) ,_status(TSTATUS::THREAD_NEW) ,_joinable(true),_cb(cb) ,_result(nullptr) ,_data(data) { _name = "Thread_" + std::to_string(gnumber++); } ~Thread() {} bool Start() { int n = pthread_create(&_tid,nullptr,ThreadRoutine,this); if(n != 0) return false; ToRuning(); return true; } void Join() { if (_joinable) { int n = pthread_join(_tid, &_result); if (n != 0) { std::cerr << "join error: " << n << std::endl; return; } (void)_result; _status = TSTATUS::THREAD_STOP; } else { std::cerr << "error, thread join status : " << _joinable << std::endl; } } void Detach() { if(_status == TSTATUS::THREAD_RUNNING && _joinable) { pthread_detach(_tid); _joinable = false; } else std::cout << "detach " << _name << "failed" << std::endl; } void Stop() { } void Die() { if(_status == TSTATUS::THREAD_RUNNING) { pthread_cancel(_tid); _status = TSTATUS::THREAD_STOP; } } void PrintInfo() { std::cout << "thread name: " << _name << std::endl; std::cout << "thread _tid: " << _tid << std::endl; std::cout << "thread _status: " << StatusString(_status) << std::endl; std::cout << "thread _joinable: " << isJoin(_joinable) << std::endl; } private: std::string _name; pthread_t _tid; TSTATUS _status; bool _joinable; callback_t<T> _cb;//用户自定义线程的执行函数 void* _result;//线程的退出信息 T _data; }; } // namespace ThreadModule

测试封装的线程:

#include "Thread_version1.hpp" #include <unistd.h> #include <vector> class Task { public: Task(int x, int y) : _x(x), _y(y) { } void Execute() { _result = _x + _y; } void Print() { std::cout << _x << "+" << _y << "=" << _result << std::endl; } private: int _x; int _y; int _result; }; // void routine(int cnt) // { // char name[64]; // pthread_getname_np(pthread_self(),name,sizeof(name)); // int cnt = 10; // while(true) // { // std::cout << "new thread running: " << name << "count :" << std::endl; // sleep(1); // } // } int main() { //构建任务 srand(time(nullptr) ^ getpid()); const int num = 10; std::vector<Task> tasks; for(int i = 0; i < 10;i++) { tasks.emplace_back(rand()%10 + 1,3); } std::vector<ThreadModule::Thread> threads; for(int i = 0;i < 10;i++) { threads.emplace_back([i,&tasks](){ tasks[i].Execute(); }); } for(auto& t : threads) { t.Start(); } for(auto& t : threads) { t.Join(); t.PrintInfo(); } for(auto& t : tasks) { t.Print(); } //////////////////////////////////////////////////// // ThreadModule::Thread<int> t(routine,10);//关于可以传多个参数问题,可以传个类过去,这个类里面有多个类型变量 // sleep(1); // t.Start();//创建线程 // sleep(5); // t.Die();//杀掉线程 // sleep(1); // t.Join();//等待线程 // t.PrintInfo();//打印线程信息 return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 6:27:50

边缘计算场景落地:轻量级腾讯混元OCR部署在工业摄像头终端

边缘计算场景落地&#xff1a;轻量级腾讯混元OCR部署在工业摄像头终端 在现代工厂的质检线上&#xff0c;一台工业摄像头正对准传送带上的产品标签。不到一秒&#xff0c;系统便自动识别出订单编号、客户名称和数量&#xff0c;并实时更新到MES系统中——整个过程无需人工干预&…

作者头像 李华
网站建设 2026/8/10 22:50:52

谷歌镜像搜索语法进阶:精准定位HunyuanOCR技术白皮书

谷歌镜像搜索语法进阶&#xff1a;精准定位HunyuanOCR技术白皮书 在AI研发的日常中&#xff0c;我们常面临一个看似简单却极具挑战的问题&#xff1a;如何快速找到某个前沿模型的原始资料&#xff1f;比如你想复现腾讯最新发布的 HunyuanOCR&#xff0c;却发现官网只有宣传稿、…

作者头像 李华
网站建设 2026/8/10 22:02:11

揭秘C# 12顶级语句隐藏风险:复杂解决方案中必须规避的5大陷阱

第一章&#xff1a;C# 12顶级语句的演进与项目适用性分析 C# 12 对顶级语句&#xff08;Top-Level Statements&#xff09;进行了进一步优化&#xff0c;使其在简洁性与可读性之间达到更佳平衡。开发者无需再编写冗长的类和方法包装&#xff0c;即可直接在程序入口执行逻辑&…

作者头像 李华
网站建设 2026/8/9 4:52:39

Lambda表达式支持默认参数吗?真相令人意外,看完恍然大悟

第一章&#xff1a;Lambda表达式支持默认参数吗&#xff1f;真相令人意外&#xff0c;看完恍然大悟在现代编程语言中&#xff0c;Lambda 表达式因其简洁的语法和函数式编程特性而广受欢迎。然而&#xff0c;一个常被误解的问题是&#xff1a;Lambda 表达式是否支持默认参数&…

作者头像 李华
网站建设 2026/8/3 22:39:59

GitHub镜像同步工具推荐:保持HunyuanOCR代码库最新

GitHub镜像同步与HunyuanOCR部署&#xff1a;构建高效稳定的端到端OCR系统 在AI工程落地的实践中&#xff0c;一个看似简单却常被忽视的问题正在拖慢研发节奏——如何稳定、快速地获取并持续更新开源项目代码&#xff1f;尤其是在国内网络环境下&#xff0c;直接从 github.com …

作者头像 李华