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;
}