线程封装
pthread_t tid;
pthread_create(&tid, NULL, callback, NULL);
最原始的线程创建方式,线程通过回调函数callback
来实现不同的功能。这种方式不仅使得线程创建函数散落在代码的各个地方,而且通过函数功能来区分线程有违面向对象概念。接下来,通过面向对象思想将线程进行封装,用户只需要继承线程基类,实现回调函数,即可完成自定义线程类的创建。
线程设计
线程不能对自己进行join
与cancel
操作,因而将线程管理功能委托给线程控制器。整体设计如下图:
线程实体
- Run 启动线程
- IsAlive 线程是否正在运转
- Handler 所有用户自定义线程都需要实现该函数
- GetThreadControl 返回一个线程控制器
线程控制实体
- Id 返回线程的线程ID
- Join 等待线程运行完毕
- Stop 停止线程
- Detach 分离线程
线程原理
ThreadControl Thread::Run()
{
pthread_create(&_tid, NULL, Thread::CallBack, this);
return ThreadControl(_tid);
}
void *Thread::CallBack(void *arg)
{
Thread *thread = reinterpret_cast<Thread*>(arg);
thread->Handler();
}
pthread_create
函数创建线程,调用线程处理函数Thread::CallBack
,传入参数this
。CallBack
为类Thread的静态函数,通过传入的this指针调用Thread类的Handler
。Handle
为纯虚函数,由子类负责实现。
自定义线程
Handler
是基类Thread的一个虚函数,用户继承Thread并实现Handler即可,剩下工作由Thread线程类完成。
class UserDefThread : public Thread
{
public:
void Handler() { cout << "Hello World!" << endl; }
};
UserDefThread myThread;
myThread.Run();
代码路径:https://github.com/spch2008/threadpool/blob/v1.0/include/thread.h