您的位置:首页 > 运维架构 > Linux

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

2015-09-29 18:37 633 查看
此示例是在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;
}

编译运行结果如下:


本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: