此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下:

ThreadBase.cpp, ThreadBase.h为线程基类

ThreadDerive.cpp, ThreadDerive.h为测试派生类

main.cpp为测试程序

ThreadBase.h内容如下:

#ifndef __THREADBASE_H__

#define __THREADBASE_H__

#include

//线程基类

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

#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

#include

#include

//构造函数

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

#include

#include

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

c++线程类 linux,C++进阶学习——线程基类的设计(Linux)相关推荐

  1. Linux初学者进阶学习资源整理

    Linux初学者进阶学习资源整理 实验楼分享的Linux学习路径,用图文并茂的形式清晰直观的告诉了Linux初学者该如何从一个新手小白进阶成为Linux高手. 不过这条Linux学习路径到底只是一个学 ...

  2. C# - 类_使用新成员隐藏基类成员

    1 using System; 2 3 namespace 类_使用新成员隐藏基类成员 4 { 5 // 基类 : Animal 6 public class Animal 7 { 8 // 基类的普 ...

  3. 【C++】【读个小故事就弄懂】为什么基类指针可以指向派生类对象,而派生类指针却不可以指向基类对象?(最易懂最有趣最生动的举例)

        在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间.     当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素.     于是基类的指针就可 ...

  4. C++类的多继承和虚基类

    文章目录 前言: 1.多重继承 1.1 多重继承的概念 1.2 多重继承的用法 1.3 多重继承的弊端:二义性 2.虚基类 2.1 虚基类的概念 2.2 虚基类的初始化 2.3 使用注意事项 前言: ...

  5. 《Linux运维学习日记》第二篇:Linux的安装[CentOS 7.X]

    一.各硬件装置在Linux中的文件名 因为在Linux中,所有东西都是一个文件,其中就包括了硬件设备,所以各硬件设置在Linux中的文件名如下图所示(更多Linux内核支持的硬件设备与文件名可以到 h ...

  6. C++ 在派生类中使用using声明改变基类成员的可访问性

    通过在类的内部使用using声明语句 , 我们可以将该类的直接或间接基类中的任何可访问成员标记出来 (只限于非私有成员) .using声明语句中名字的访问权限由该using声明语句之前的访问说明符来决 ...

  7. 实验四:继承性和派生类 建一个楼房Building为基类,建立住宅类House继承Building,存储房号和面积,建立办公室类Office继承Building,存储办公室名称和电话

    /* * 实验四:继承性和派生类 * 内容提要:建立一个楼房基类Building为基类,用于存储地址和楼号 * 建立住宅类House继承Building, 用来存储房号和面积, * 另外建立办公室类O ...

  8. python 基类是什么_python之抽象基类

    python之抽象基类 抽象基类,在这个类中定义一些方法,所有继承这个类的类必须实现这个方法,并且这个类不能被实例化, 使用抽象基类的情况: 1.某些情况下希望判断某个对象的类型 2.强制子类必须实现 ...

  9. Java7编程 高级进阶学习笔记--嵌套类

    定义: 在一个类中定义的类叫做嵌套类. 作用: 1.允许对相关类进行逻辑分组 2.增强了代码的封装性 3.使代码具有更强的可读性和维护性 使用方式: package com.cmz.baseTest; ...

  10. Linux驱动进阶学习--HDMI设备之edid相关开发

    一.引言 二.HDMI设备 ------> 1.edid ------> 2.edid修改的相关工具 ------------> 2.1.MonitorInfoView ------ ...

最新文章

  1. Kubernetes — Harbor 分布式镜像仓库
  2. 4.MYSQL 三大范式+BC范式
  3. php 接口测压,PHP API接口测试小工具
  4. 可持久化数据结构加扫描线_结构化光扫描
  5. 什么是端到端训练测试_为什么端到端测试对您的团队很重要
  6. 基于图的图像分割(Graph-Based Image Segmentation)
  7. Ubuntu redmine 安装
  8. Jenkins部署java项目实例
  9. ios通过url下载显示图片
  10. 【水果识别】基于matlab GUI苹果质量检测及分级系统【含Matlab源码 896期】
  11. PostgreSQL 删除表格
  12. 会考计算机考试vb知识,信息技术会考系统
  13. 基于插值算法和Gardner定时误差检测的OOK信号定时同步的FPGA实现
  14. ToDoList本地存储原生js版/jQuery版
  15. Win7系统专业版调整屏幕亮度的详细教程--win7w.com
  16. Javascript的常见数据类型以及相应操作
  17. apache zeppelin安装
  18. SPA与MPA之间的区别
  19. solaris磁带机 tar 备份
  20. 小程序音视频功能的原理及应用

热门文章

  1. git分支详细讲解,模拟分支开发,为什么使用分支开发
  2. 异型烟分拣 机器人_细支烟、标准烟共线分拣可行性研究
  3. python 拟合分布_如何使用python将weibull分布拟合到数据?
  4. python实用宝典_python 5个实用的技巧
  5. 不支持给定路径的格式_【国考那些事】2021国/省考,申论答题格式,建议收藏!...
  6. oracle查询functions名字,oracle 怎样查看已经存在的函数,过程?
  7. 观点对立,无关虚拟现实技术
  8. AppLinks使用详解
  9. 多路复用输入/输出 ---- select
  10. hdu-1242 dfs+各种剪枝