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

此示例是在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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值