此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下:
#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
#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; }
#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
#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); } }
#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://blog.csdn.net/tennysonsky/article/details/48809725