本程序使用面向对象的风格对线程进行类封装,代码如下:
类头文件:
//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: 面向对象风格的线程类封装
#include <pthread.h>
#include <iostream>
#ifndef _LCW_THREAD_H_
#define _LCW_THREAD_H_
//线程基类
class lcw_thread
{
public:
lcw_thread();
virtual ~lcw_thread();//虚析构函数
void Start();
void Join();
void SetAutoDelete(bool AutoDelete);
private:
static void* Thread_Routine(void* arg);
virtual void Run() = 0;//Run隐含的第一个参数是this指针,纯虚函数,基类不实现,为抽象接口
pthread_t lcwid;
bool AutoDelete;//是否自动销毁
};
#endif
类实现:
//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: 面向对象风格的线程类封装
#include "lcw_thread.h"
using namespace std;
lcw_thread::lcw_thread() :AutoDelete(false)
{
cout << "基类构造函数lcw_thread" << endl;
}
lcw_thread::~lcw_thread()
{
cout << "基类析构函数~lcw_thread" << endl;
}
void lcw_thread::Start()//启动线程
{
pthread_create(&lcwid,NULL,Thread_Routine,this);//this指针是参数
}
void lcw_thread::Join()
{//函数pthread_join用来等待一个线程的结束
pthread_join(lcwid,NULL);
}
void* lcw_thread::Thread_Routine(void* arg)
{//参数arg其实是this指针
lcw_thread* lcwthread = static_cast<lcw_thread*>(arg);//指向派生类指针转化为基类对象指针
lcwthread->Run();
if(lcwthread->AutoDelete)//
{
delete lcwthread;//销毁线程
}
return NULL;
}
void lcw_thread::SetAutoDelete(bool AutoDelete_)
{
AutoDelete = AutoDelete_;//设置是否自动销毁
}
派生类和主测试函数:
//start from the very beginning,and to create greatness
//@author: Chuangwei Lin
//@E-mail:979951191@qq.com
//@brief: 面向对象风格的线程类封装
#include "lcw_thread.h"
#include <unistd.h>
using namespace std;
//派生类,从lcw_thread共有继承
class lcw_thread_test : public lcw_thread
{
public: //count_初始化为count
lcw_thread_test(int count):count_(count)
{
cout << "派生类构造函数lcw_thread_test" << endl;
}
~lcw_thread_test()
{
cout << "派生类析构函数~lcw_thread_test" <<endl;
}
void Run()
{
while(count_--)
{
cout <<"子线程第"<< 5-count_ <<"次测试" << endl;
sleep(1);
}
}
int count_;
};
int main(int argc, char const *argv[])
{
// lcw_thread_test lcw(5);//创建派生类对象
// lcw.Start();//创建线程
//以下动态创建对象,使得线程周期结束时线程对象能够自动销毁
lcw_thread_test* lcw = new lcw_thread_test(5);
lcw->SetAutoDelete(true);//设置自动销毁
lcw->Start();
//主函数也来下输出
for(int i =1 ;i <= 5;++ i)
{
cout << "主函数第"<< i <<"次输出" << endl;
sleep(1);
}
//lcw->Join();//等待线程结束
return 0;
}
运行结果:
由于竞争关系,输出会有一点混乱