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

Linux学习:简单模拟实现C++中的线程类

目录

  • 1. 线程类的设计思路
  • 2. 简单线程类的实现

1. 线程类的设计思路

在这里插入图片描述

  • 线程函数:用于给pthread_create当作参数传递的函数,类型void*()(void*)
  • 任务函数:实现线程真正需要执行其任务的函数,类型自定义

  在线程类的设计中,真正负责创建并启动线程的成员函数是start,其中会调用pthread_create。而线程函数的传参此处设计中,并不是直接进行传参,而是使用void*()(void*)类型的静态成员函数threadroutine将任务函数进行封装,然后传参给pthread_create
  通过给静态成员函数threadroutine传递Thread*类型的参数,让其使用此参数去调用任务函数。从而达到让线程能够执行指定任务函数的效果,此种设计方式让任务函数的定义更加灵活自由,更便于使用。
  此处设计中,只能使用静态成员函数将任务函数进行包装,这是因为普通的成员函数固定会有一个隐藏参数,指向自己的this指针,类型不符合pthread_create传参的类型要求。

2. 简单线程类的实现

Thread.hpp

#ifndef THREAD_MODULE
#define THREAD_MODULE
#include <pthread.h>
#include <iostream>
using namespace std;
#include <functional>namespace ThreadModule
{//将需要执行的函数类型使用包装器封装定义并重命名//函数模板声明在类外//函数模板必须使用自己定义模板参数template<typename T>using func_t = function<void(T)>;template<typename T>class Thread{public:Thread(func_t<T> func, T data, string name = "none-thread"):_func(func), _data(data), _name(name), _stop(true){}~Thread(){}void Execute(){_func(_data);}static void* threadroutine(void* arg){Thread<T>* ptd = static_cast<Thread<T>*>(arg);ptd->Execute();return nullptr;}bool start(){int n = pthread_create(&_tid, nullptr, threadroutine, this);if(n){return false; }_stop = false;return true;}void join(){if(!_stop){pthread_join(_tid, nullptr);}}void detach(){if(!_stop){pthread_detach(_tid);}}string name(){return _name;}void stop(){_stop = true;}private:pthread_t _tid;string _name;func_t<T> _func;T _data;bool _stop;};
}
#endif

main.cc:调用验证代码

#include "Thread.hpp"
using namespace THREAD_MODULE;void Print(int num)
{int cnt = 5;while(cnt--){cout << "num is : " << num << endl;sleep(1);}
}int main()
{Thread<int> td(Print, 10);td.start();td.join();return 0;
}
http://www.dtcms.com/a/360449.html

相关文章:

  • C++算法学习专题:前缀和
  • 【Linux网络编程】应用层协议-----HTTP协议
  • PostgreSQL表膨胀的危害与解决方案
  • More Effective C++ 条款19:理解临时对象的来源(Understand the Origin of Temporary Objects)
  • centos 7 安装docker、docker-compose教程
  • AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​
  • 国产数据库之TiDB:博采众长
  • Ruoyi-vue-plus-5.x第二篇MyBatis-Plus数据持久层技术:2.2 分页与性能优化
  • [嵌入式embed]Keil5项目提示Missing: Compiler Version 5
  • 工业互联项目总结:UART
  • Backroom:信息代币化 AI 时代数据冗杂的解决方案
  • 漏洞基础与文件包含漏洞原理级分析
  • 使用 Python mlxtend库进行购物篮分析、关联规则
  • 软考中级习题与解答——第一章_数据结构与算法基础(3)
  • 进程状态 —— Linux内核(Kernel)
  • Linux 文件夹权限也会导致基本命令权限缺失问题
  • 【学Python自动化】 5. Python 数据结构学习笔记
  • postman带Token测试接口
  • 打工人日报#20250831
  • LangChain核心抽象:Runnable接口深度解析
  • * 和**有时展开,有时收集。*在对可迭代对象展开 **对字典展开。一般只看收集就够了,在函数定义的时候传入参数用
  • 第二十七天-ADC模数转换实验
  • linux系统学习(12.linux服务)
  • 【星闪】Hi2821 | SPI串行外设接口 + OLED显示屏驱动例程
  • 语音芯片3W输出唯创知音WTN6040FP、WT588F02BP-14S、WT588F04AP-14S
  • [回溯+堆优化]37. 解数独
  • Q1 Top IF 18.7 | 基于泛基因组揭示植物NLR进化
  • 高校心理教育辅导系统的设计与实现|基于SpringBoot高校心理教育辅导系统的设计与实现
  • 网格图--Day02--网格图DFS--面试题 16.19. 水域大小,LCS 03. 主题空间,463. 岛屿的周长
  • 技术总体方案设计思路