c++线程类 linux,C++进阶学习——线程基类的设计(Linux)
此示例是在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)相关推荐
- Linux初学者进阶学习资源整理
Linux初学者进阶学习资源整理 实验楼分享的Linux学习路径,用图文并茂的形式清晰直观的告诉了Linux初学者该如何从一个新手小白进阶成为Linux高手. 不过这条Linux学习路径到底只是一个学 ...
- C# - 类_使用新成员隐藏基类成员
1 using System; 2 3 namespace 类_使用新成员隐藏基类成员 4 { 5 // 基类 : Animal 6 public class Animal 7 { 8 // 基类的普 ...
- 【C++】【读个小故事就弄懂】为什么基类指针可以指向派生类对象,而派生类指针却不可以指向基类对象?(最易懂最有趣最生动的举例)
在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间. 当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素. 于是基类的指针就可 ...
- C++类的多继承和虚基类
文章目录 前言: 1.多重继承 1.1 多重继承的概念 1.2 多重继承的用法 1.3 多重继承的弊端:二义性 2.虚基类 2.1 虚基类的概念 2.2 虚基类的初始化 2.3 使用注意事项 前言: ...
- 《Linux运维学习日记》第二篇:Linux的安装[CentOS 7.X]
一.各硬件装置在Linux中的文件名 因为在Linux中,所有东西都是一个文件,其中就包括了硬件设备,所以各硬件设置在Linux中的文件名如下图所示(更多Linux内核支持的硬件设备与文件名可以到 h ...
- C++ 在派生类中使用using声明改变基类成员的可访问性
通过在类的内部使用using声明语句 , 我们可以将该类的直接或间接基类中的任何可访问成员标记出来 (只限于非私有成员) .using声明语句中名字的访问权限由该using声明语句之前的访问说明符来决 ...
- 实验四:继承性和派生类 建一个楼房Building为基类,建立住宅类House继承Building,存储房号和面积,建立办公室类Office继承Building,存储办公室名称和电话
/* * 实验四:继承性和派生类 * 内容提要:建立一个楼房基类Building为基类,用于存储地址和楼号 * 建立住宅类House继承Building, 用来存储房号和面积, * 另外建立办公室类O ...
- python 基类是什么_python之抽象基类
python之抽象基类 抽象基类,在这个类中定义一些方法,所有继承这个类的类必须实现这个方法,并且这个类不能被实例化, 使用抽象基类的情况: 1.某些情况下希望判断某个对象的类型 2.强制子类必须实现 ...
- Java7编程 高级进阶学习笔记--嵌套类
定义: 在一个类中定义的类叫做嵌套类. 作用: 1.允许对相关类进行逻辑分组 2.增强了代码的封装性 3.使代码具有更强的可读性和维护性 使用方式: package com.cmz.baseTest; ...
- Linux驱动进阶学习--HDMI设备之edid相关开发
一.引言 二.HDMI设备 ------> 1.edid ------> 2.edid修改的相关工具 ------------> 2.1.MonitorInfoView ------ ...
最新文章
- Kubernetes — Harbor 分布式镜像仓库
- 4.MYSQL 三大范式+BC范式
- php 接口测压,PHP API接口测试小工具
- 可持久化数据结构加扫描线_结构化光扫描
- 什么是端到端训练测试_为什么端到端测试对您的团队很重要
- 基于图的图像分割(Graph-Based Image Segmentation)
- Ubuntu redmine 安装
- Jenkins部署java项目实例
- ios通过url下载显示图片
- 【水果识别】基于matlab GUI苹果质量检测及分级系统【含Matlab源码 896期】
- PostgreSQL 删除表格
- 会考计算机考试vb知识,信息技术会考系统
- 基于插值算法和Gardner定时误差检测的OOK信号定时同步的FPGA实现
- ToDoList本地存储原生js版/jQuery版
- Win7系统专业版调整屏幕亮度的详细教程--win7w.com
- Javascript的常见数据类型以及相应操作
- apache zeppelin安装
- SPA与MPA之间的区别
- solaris磁带机 tar 备份
- 小程序音视频功能的原理及应用
热门文章
- git分支详细讲解,模拟分支开发,为什么使用分支开发
- 异型烟分拣 机器人_细支烟、标准烟共线分拣可行性研究
- python 拟合分布_如何使用python将weibull分布拟合到数据?
- python实用宝典_python 5个实用的技巧
- 不支持给定路径的格式_【国考那些事】2021国/省考,申论答题格式,建议收藏!...
- oracle查询functions名字,oracle 怎样查看已经存在的函数,过程?
- 观点对立,无关虚拟现实技术
- AppLinks使用详解
- 多路复用输入/输出 ---- select
- hdu-1242 dfs+各种剪枝