热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下:ThreadBase.cpp,ThreadBase.h为线程基类Th

此示例是在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

{

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;

}

编译运行结果如下:

f81d9d5798693a58cc71c52afe4f320b.png

版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!!

原文:http://blog.csdn.net/tennysonsky/article/details/48809725



推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
author-avatar
女院外语系10级商务英语一班
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有