红联Linux门户
Linux帮助

C++进阶学习——线程基类的设计(Linux)

发布时间:2016-09-09 15:24:39来源:linux网站作者:Mike__Jiang
此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下:
ThreadBase.cpp, ThreadBase.h为线程基类
ThreadDerive.cpp, ThreadDerive.h为测试派生类
main.cpp为测试程序
 
ThreadBase.h内容如下:
#ifndef __THREADBASE_H__  
#define __THREADBASE_H__  
#include <pthread.h>
//线程基类  
class ThreadBase  
{  
public:  
ThreadBase(); //构造函数  
virtual ~ThreadBase(); //虚析构函数  
virtual int start(); //启动线程  
virtual void routine(); //线程的运行函数,由派生类实现  
virtual pthread_t self(); //获取当前线程的线程号  
virtual int equal(pthread_t t); //比较线程号是否相等  
virtual int detach(); //分离线程  
virtual int join(pthread_t t); //连接线程  
virtual int exit(); //线程退出  
virtual int cancel(pthread_t t); //取消线程  
virtual int destroy(); //销毁线程  
private:  
static void cleaner(void *pHandle); //线程清理函数  
static void *work(void *pHandle); //线程回调函数  
private:  
pthread_attr_t  t_attr; //线程属性  
pthread_t tid; //线程号  
};  
#endif  
 
ThreadBase.cpp内容如下:
#include <stdio.h>  
#include "ThreadBase.h"  
//构造函数,通过参数列表方式给线程号初始化为0  
ThreadBase::ThreadBase():tid(0)  
{  
}  
//虚析构函数  
ThreadBase::~ThreadBase()  
{  
printf("~ThreadBase\n");  
}  
/**************************************************************** 
@功能:启动线程 
@参数:无 
@返回值: 成功:0,失败:-1 
******************************************************************/   
int ThreadBase::start()  
{  
int ret = 0;  
size_t nsize = 1024*20; //20k  
ret = pthread_attr_init(&t_attr); //初始化线程属性  
if(ret != 0)  
{  
perror("pthread_attr_init");
return -1;
}  
//设置线程的堆栈大小  
ret = pthread_attr_setstacksize(&t_attr, nsize);  
if(ret != 0)  
{  
perror("pthread_attr_getstacksize");
return -1;
}  
//创建线程  
return pthread_create(&tid, &t_attr, work, this);  
}  
/**************************************************************** 
@功能:线程的运行函数,此处为空,由派生类实现 
@参数:无 
@返回值: 无 
******************************************************************/   
void ThreadBase::routine()  
{  
}  
/**************************************************************** 
@功能:获取当前线程的线程号 
@参数:无 
@返回值: 线程号 
******************************************************************/   
pthread_t ThreadBase::self()  
{  
if(!tid)  
{  
tid = pthread_self(); //获取线程号  
}  
return tid;   
}  
/**************************************************************** 
@功能:比较线程号是否相等 
@参数:待比较的线程号 
@返回值: 相等:0,不相等:-1 
******************************************************************/   
int ThreadBase::equal(pthread_t t)  
{  
int ret = 0;  
ret = pthread_equal(tid, t);  
return (ret)?0:-1;  
}  
/**************************************************************** 
@功能:分离线程,待线程结束时让系统自动回收其资源 
@参数:无 
@返回值: 成功:0,失败:-1 
******************************************************************/   
int ThreadBase::detach()  
{  
return pthread_detach(tid);  
}  
/**************************************************************** 
@功能:连接线程,等待指定的线程结束,并回收其资源 
@参数:无 
@返回值: 成功:0,失败:-1 
******************************************************************/   
int ThreadBase::join(pthread_t t)  
{  
return pthread_join(t, NULL);  
}  
/**************************************************************** 
@功能:线程退出 
@参数:无 
@返回值: 成功:0,失败:-1 
******************************************************************/   
int ThreadBase::exit()  
{  
int ret = 0;  
pthread_exit(NULL);  
return ret;  
}  
/**************************************************************** 
@功能:取消线程 
@参数:线程号 
@返回值: 成功:0,失败:-1 
******************************************************************/   
int ThreadBase::cancel(pthread_t t)  
{  
return  pthread_cancel(t);  
}  
/**************************************************************** 
@功能:销毁线程 
@参数:线程号 
@返回值: 成功:0,失败:-1 
******************************************************************/   
int ThreadBase::destroy()  
{  
return cancel(tid);  
}  
/**************************************************************** 
@功能:线程清理函数 
@参数:线程句柄 
@返回值: 无 
******************************************************************/   
void ThreadBase::cleaner(void *pHandle)  
{  
ThreadBase *p = (ThreadBase *)pHandle;  
delete p;  
p = NULL;  
printf("after clean\n");  
}  
/**************************************************************** 
@功能:线程回调函数 
@参数:线程句柄 
@返回值: 无 
******************************************************************/
void *ThreadBase::work(void *pHandle)  
{  
ThreadBase* pThread = (ThreadBase *)pHandle;  
//注册线程处理函数  
pthread_cleanup_push(cleaner, pHandle);  
pThread->routine(); //线程运行函数  
//线程资源释放,参数为非0  
pthread_cleanup_pop(1);  
return NULL;  
}  
 
ThreadDerive.h内容如下:
#ifndef _THREADDERIVE_H_  
#define _THREADDERIVE_H_  
#include "ThreadBase.h"  
//派生类ThreadDerive,公有继承于ThreadBase  
class ThreadDerive: public ThreadBase  
{  
public:  
ThreadDerive();  
~ThreadDerive();  
void init(const int n, const char *str);  
void routine();  
private:  
char buf[512];  
int num;  
};
#endif  
 
ThreadDerive.cpp内容如下:
#include "ThreadDerive.h"  
#include <string.h>  
#include <stdio.h>  
#include <unistd.h>  
//构造函数  
ThreadDerive::ThreadDerive()  
{  
num = 0;  
memset(buf, 0, sizeof(buf));  
}
//析构函数  
ThreadDerive::~ThreadDerive()  
{  
printf("~ThreadDerive\n");  
}
//初始化数据  
void ThreadDerive::init(const int n, const char *str)  
{  
num = n;  
strcpy(buf, str);  
}
//线程运行函数  
void ThreadDerive::routine()  
{  
printf("I am running\n");  
for(int i = 0; i < num; i++)  
{  
printf("buf = %s, num = %d\n", buf, num);  
sleep(1);  
}  
}  
 
main.cpp内容如下:
#include "ThreadDerive.h"  
#include <unistd.h>  
#include <stdio.h>  
#include <pthread.h>  
int main()  
{  
//一定要动态分配空间,因为基类清理时使用了detele  
//不需要人为detele,线程基类已经做处理  
ThreadDerive *derive = new ThreadDerive;  
derive->init(5, "i am mike");  
derive->start();  
//usleep(1000*100); //保证线程已经执行  
pthread_t tid = derive->self();  
printf("tid ========= %lu\n", tid);  
derive->detach(); //分离线程  
while(1)  
{  
printf("in the main fun\n");  
sleep(1); 
}
return 0;  
}
 
编译运行结果如下:
C++进阶学习——线程基类的设计(Linux)
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24019.html