最近在Linux 下用C++做的东西,原来是使用“多进程”方式实现,现在随着工程的增大,“多进程”的“变量共享”问题已经十分突出了,虽然可以使“内存共享”等方式实现,但大量的“内存共享”会导致代码混乱。。

所以决心将整个工程重新写,使用“多线程”方式实现,这样可以大大较少“内存共享”的使用次数。

下面是我写的基类,把代码保存在名为 Thread.h 的头文件中。

====================================传说中的分割线=================================

====================================传说中的分割线=================================/* * File: Thread.h * Author: Null * Blog: http://hi.baidu.com/hetaoos * Created on 2008年7月30日, 上午10:13 */ /* * 在编译的时候记得加上参数:-lpthread * */#ifndef_THREAD_H

#define _THREAD_H

#include#includeclassThread

{private://当前线程的线程IDpthread_t tid;//线程的状态intthreadStatus;//获取执行方法的指针static void*run0(void*pVoid);//内部执行方法void*run1();public://线程的状态-新建static const intTHREAD_STATUS_NEW =0;//线程的状态-正在运行static const intTHREAD_STATUS_RUNNING =1;//线程的状态-运行结束static const intTHREAD_STATUS_EXIT = -1;//构造函数Thread();//线程的运行实体virtual voidrun() =0;//开始执行线程boolstart();//获取线程IDpthread_t getThreadID();//获取线程状态intgetState();//等待线程直至退出voidjoin();//等待线程退出或者超时voidjoin(unsigned longmillisTime); };void*Thread::run0(void*pVoid) {Thread*p = (Thread*)pVoid;p->run1();returnp; }void*Thread::run1() {threadStatus =THREAD_STATUS_RUNNING;tid =pthread_self();run();threadStatus =THREAD_STATUS_EXIT;tid =0;pthread_exit(NULL); }Thread::Thread() {tid =0;threadStatus =THREAD_STATUS_NEW; }boolThread::start() {returnpthread_create(&tid,NULL,run0,this) ==0; }pthread_t Thread::getThreadID() {returntid; }intThread::getState() {returnthreadStatus; }voidThread::join() {if(tid >0) {pthread_join(tid,NULL); } }voidThread::join(unsigned longmillisTime) {if(tid ==0) {return; }if(millisTime ==0) {join(); }else{unsigned longk =0;while(threadStatus !=THREAD_STATUS_EXIT &&k <=millisTime) {usleep(100);k++; } } }#endif /* _THREAD_H */

用法简单类似于 Java 的 Thread,继承 Thread 类,然后重写 void run() 方法,然后用 bool start () 方法开始运行。这样完全屏蔽掉了线程的具体操作。使用简单方便。

具体看下面的示例代码。

====================================传说中的分割线=================================

/* * File: newmain.cc * Author: Null * Blog: http://hi.baidu.com/hetaoos * Created on 2008年7月30日, 上午11:49 */#include"Thread.h"#includeclassMultiThread :publicThread

{public:voidrun() {intnumber =0;for(inti =0;i <10;i++) {cout <start();mt->join(6000);return(EXIT_SUCCESS); }

====================================传说中的分割线=================================

上面的代码,由于 join 设置超时为 6 秒,所以没能完全打印出10条记录就已经退出了。

上面的代码还有些不足:

1,���有线程属性的设置,这个当初也考虑过,但是有些麻烦,也很少用。如果哪位大侠实现了比较完成的 Thread 类,麻烦发个给我。

2,线程的控制有待完善,这个阿,暂时没有时间研究。

在原来的基础上,进行了加强,使之进一步接近 Java 中 Thread 和 Runnable 的用法。 下面是我写的基类,把代码保存在名为 Thread.h 的头文件中。 ====================================传说中的分割线=================================

/* * File: Thread.h * Author: Null * Blog: http://hi.baidu.com/hetaoos * Created on 2008年7月30日, 上午10:13 */ /* * 在编译的时候记得加上参数:-lpthread * */#ifndef_THREAD_H

#define _THREAD_H

#include#include/* * 线程运行实体类 */classRunnable

{public://运行实体virtual voidrun() =0; };/* * 线程类 * */classThread :publicRunnable

{private://线程初始化序号static intthreadInitNumber;//当前线程初始化序号intcurThreadInitNumber;//线程体Runnable *target;//当前线程的线程IDpthread_t tid;//线程的状态intthreadStatus;//线程属性pthread_attr_t attr;//线程优先级sched_param param;//获取执行方法的指针static void*run0(void*pVoid);//内部执行方法void*run1();//获取一个线程序号static intgetNextThreadNum();public://线程的状态-新建static const intTHREAD_STATUS_NEW =0;//线程的状态-正在运行static const intTHREAD_STATUS_RUNNING =1;//线程的状态-运行结束static const intTHREAD_STATUS_EXIT = -1;//构造函数Thread();//构造函数Thread(Runnable *iTarget);//析构~Thread();//线程的运行实体voidrun();//开始执行线程boolstart();//获取线程状态intgetState();//等待线程直至退出voidjoin();//等待线程退出或者超时voidjoin(unsigned longmillisTime);//比较两个线程时候相同,通过 curThreadInitNumber 判断bool operator==(constThread *otherThread);//获取This线程IDpthread_t getThreadID();//获取当前线程IDstaticpthread_t getCurrentThreadID();//当前线程是否和某个线程相等,通过 tid 判断static boolisEquals(Thread *iTarget);//设置线程的类型:绑定/非绑定voidsetThreadScope(boolisSystem);//获取线程的类型:绑定/非绑定boolgetThreadScope();//设置线程的优先级,1-99,其中99为实时;意外的为普通voidsetThreadPriority(intpriority);//获取线程的优先级intgetThreadPriority(); };intThread::threadInitNumber =1;inline intThread::getNextThreadNum() {returnthreadInitNumber++; }void*Thread::run0(void*pVoid) {Thread*p = (Thread*)pVoid;p->run1();returnp; }void*Thread::run1() {threadStatus =THREAD_STATUS_RUNNING;tid =pthread_self();run();threadStatus =THREAD_STATUS_EXIT;tid =0;pthread_exit(NULL); }voidThread::run() {if(target !=NULL) { (*target).run(); } }Thread::Thread() {tid =0;threadStatus =THREAD_STATUS_NEW;curThreadInitNumber =getNextThreadNum();pthread_attr_init(&attr); }Thread::Thread(Runnable *iTarget) {target =iTarget;tid =0;threadStatus =THREAD_STATUS_NEW;curThreadInitNumber =getNextThreadNum();pthread_attr_init(&attr); }Thread::~Thread() {pthread_attr_destroy(&attr); }boolThread::start() {returnpthread_create(&tid, &attr,run0,this) ==0; }inlinepthread_t Thread::getCurrentThreadID() {returnpthread_self(); }inlinepthread_t Thread::getThreadID() {returntid; }inline intThread::getState() {returnthreadStatus; }voidThread::join() {if(tid >0) {pthread_join(tid,NULL); } }voidThread::join(unsigned longmillisTime) {if(tid ==0) {return; }if(millisTime ==0) {join(); }else{unsigned longk =0;while(threadStatus !=THREAD_STATUS_EXIT &&k <=millisTime) {usleep(100);k++; } } }boolThread::operator==(constThread *otherThread) {if(otherThread ==NULL) {return false; }if(curThreadInitNumber == (*otherThread).curThreadInitNumber) {return true; }return false; }boolThread::isEquals(Thread *iTarget) {if(iTarget ==NULL) {return false; }returnpthread_self() ==iTarget->tid; }voidThread::setThreadScope(boolisSystem) {if(isSystem) {pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM); }else{pthread_attr_setscope(&attr,PTHREAD_SCOPE_PROCESS); } }boolThread::getThreadScope() {intscopeType =0;pthread_attr_getscope(&attr, &scopeType);returnscopeType ==PTHREAD_SCOPE_SYSTEM; }voidThread::setThreadPriority(intpriority) {pthread_attr_getschedparam(&attr, &param);param.__sched_priority =priority;pthread_attr_setschedparam(&attr, &param); }intThread::getThreadPriority() {pthread_attr_getschedparam(&attr, &param);returnparam.__sched_priority; }#endif /* _THREAD_H */

====================================传说中的分割线=================================

具体看下面的示例代码。

呵呵,用法和 Java 的 Thread 很相似吧。

下面一共生成了3个线程,3个线程都共享 MultiThread::run()

在 run() 里面通过判断线程的实体来分离各个线程的工作。

====================================传说中的分割线=================================

/* * File: newmain.cc * Author: Null * Blog: http://hi.baidu.com/hetaoos * Created on 2008年7月30日, 上午12:49 */#include"Thread.h"#includeclassMultiThread :publicThread

{public:Thread *th1;Thread *th2;voidTest() {th1 =newThread(this);th1->setThreadPriority(99);th2 =newThread(this);start();th1->start();th2->start();th1->join();th2->join(); }voidrun() {//Thread->isEquals(th1)if(Thread::isEquals(th1)) {intnumber =100;for(inti =0;i <10;i++) {cout <getThreadPriority() <getThreadPriority() <getThreadPriority() <Test();return(EXIT_SUCCESS); }

====================================传说中的分割线=================================

PS:

1,还没有进行深入的测试,使用之前请进行必要的测试,以确保它符合你的要求。

2,如果你发现了 BUG,请联系我。

java 线程 基类_关于Linux 系统下 C++ 的多线程基类 Thread相关推荐

  1. nbu客户端卸载_在LINUX系统下如何卸载NetBackup

    在LINUX系统下如何卸载NetBackup 2010-11-01 11:26:52|  分类: linux 阅读12 评论0字号:大中小 1.停止 NetBackup/ 介质管理器后台驻留程序 [r ...

  2. 微信开发者工具命令行_在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折.注:带 * 的步骤或文件为不确定是否管用的步骤或文件. 本人系统为Linux ...

  3. dd linux 格式化u盘启动盘_在Linux系统下用DD命令制作ISO镜像U盘启动盘

    穆僮电脑小课堂 (QQ群:141826908)摘编整理 ​我的当前的系统是Linux(版本Xubuntu),之前是通过软通牒(UltraISO)在Windows系统下制作了这个Linux系统的U盘启动 ...

  4. python中文字体下载_解决Linux系统下python matplotlib中文字体显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些 ...

  5. java war包更新 部署_关于Linux系统下基于Tomcat部署和升级war包的详细过程

    1.首先Linux先安装java,Tomcat 中间件规范要求: 1)         软件必须下载到/services/download_soft_v        --------(用xftp上传 ...

  6. centos打显卡驱动命令_在Linux系统下安装Nvidia官方显卡驱动的方法

    一.安装Nvidia驱动步骤: 1.到NV官网:http://www.nvidia.cn/Download/index.aspx?lang=cn 下载295.59版本Linux驱动.得到一个以.run ...

  7. arm linux线程退出,【ARMLinux】linux系统下多线程编程

    /**************************************************************************************** * 文件名: pro ...

  8. Linux系统下使用java语言调用海康威视SDK连接摄像头过程记录

    1.准备工作 1.1. 设备型号 萤石多功能互联网摄像头 CS-C2C-3B2WFR 1.2. SDK下载 通过海康威视官网可以下载到最新的Linux下的SDK开发包,分为32位和64位,根据电脑情况 ...

  9. Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法

    本文分享在Linux系统下,通过Java 程序代码将Word转为PDF文档时,结果文档内容出现乱码该如何解决.具体可参考如下内容: 1.问题出现的背景 在Windows系统中,使用Spire.Doc ...

最新文章

  1. ffmpeg m4a 转pcm_FFmpeg提取视频音频python将音频转文字
  2. 数据可视化(一)-Matplotlib简易入门
  3. 为什么有些画面让你终生难忘?GAN来告诉你原因
  4. Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题
  5. mysql1231错误_Mysql学习---Python操作Mysql 1231
  6. Linux节点之间无密码问题,Linux下多节点SSH无密码互联实现
  7. 谈一谈我对前端的学习路线及方法的一些心得
  8. map flatmap mappartition flatMapToPair四种用法区别
  9. raspberry pi_Raspberry Pi,CNC铣削,WTF,Cypht,HomeBank,Wekan等的使用方法
  10. 数据库-MySQL中间的注释
  11. 个人网页制作 大学生个人网页设计 个人网站模板 简单静态HTML个人网页作品
  12. 【机器学习】如何使用随机网格搜索,以缩短网格搜索速度?
  13. Arcgis中的空间数据拓扑理论及规则
  14. UDP是全双工通信的吗
  15. html查找器如何卸载,租号器要求卸载影子系统-怎么完全删除影子系统
  16. 链上数据分析—NFT 项目质量评估
  17. 程序员返乡卖羊肉年销售1500万元,竟然是为了爱情?
  18. 【linux系统】ubuntu18.04蓝牙耳机没有声音
  19. 【Wireshark】快速上手Wireshark
  20. sigma-delta DAC 摘记(一)

热门文章

  1. Github项目分享|第一期
  2. linux用date获取时间戳格式说明
  3. fatfs文件系统与u盘驱动联立起来(usb_host)
  4. Matlab2015b x86 x64 下载和安装
  5. MYSQL 三元 函数
  6. 北工大计算机博士,北工大博士生导师黄樟钦谈计算机科学与技术专业
  7. Docker架构原理及常用命令
  8. eclipse设置字体大小以及更改快捷键
  9. 服务器或者docker容器中安装pip
  10. UVa 297 - Quadtrees 四叉树, 及其在编码图像的应用