在原来的基础上,进行了加强,使之进一步接近 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();

};#endif /* _THREAD_H */intThread::threadInitNumber =1;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;

}pthread_t Thread::getCurrentThreadID()

{returnpthread_self();

}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++;

}

}

}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;

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

具体看下面的示例代码。

呵呵,用法和 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() <

}

}else if(Thread::isEquals(th2))

{intnumber =200;for(inti =0;i <10;i++)

{cout <getThreadPriority() <

}

}else if(Thread::isEquals(this))

{intnumber =300;for(inti =0;i <10;i++)

{cout <getThreadPriority() <

}

}

}

};/*

*

*/intmain(intargc,char**argv)

{boolret;MultiThread *mt;mt =newMultiThread();mt->Test();return(EXIT_SUCCESS);

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

PS:

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

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

java thread 头文件_Linux 下 C++ 的多线程基类 - Thread相关推荐

  1. java 线程 基类_关于Linux 系统下 C++ 的多线程基类 Thread

    最近在Linux 下用C++做的东西,原来是使用"多进程"方式实现,现在随着工程的增大,"多进程"的"变量共享"问题已经十分突出了,虽然可以 ...

  2. linux open 头文件_linux下通过共享内存和mmap实现进程间通讯

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  3. C++11多线程:thread头文件

    目录 1. std::thread(class) 线程构造(constructor) joinable 线程状态 operator= join detach get_id native_handle ...

  4. Java删除指定文件夹下的文件和目录

    Java删除指定文件夹下的文件和目录 import java.io.File;public class TestFile {public static void main(String[] args) ...

  5. java怎样输出一个文件夹,java合并一个文件夹下所有txt文件,输出到另一个txt,...

    java合并一个文件夹下所有txt文件,输出到另一个txt,最近写了个单元测试,递归调用方法,把同一个文件夹里所有的txt合并输出到一个txt文件.参考了两个博客,分别是已有的方法,还有个就是检测tx ...

  6. Windows上无法使用thread头文件

    Windows上无法使用thread头文件 问题描述与分析 最近在学习C++多线程编程,没想到第一步就出现了问题.首先写了一份简单的测试代码(位于d:\test.cpp): #include < ...

  7. java获得src文件夹下的图片和 获得resource目录下的文件

    java获得src文件夹下的图片和 获得resource目录下的文件 1 获得src文件夹下的图片 文件位置 获得url代码 URL url= getClass().getClassLoader(). ...

  8. linux下mkdir头文件_Linux部分常用命令学习记录

    Linux部分常用命令 ls 显示目标列表 ls -a 显示所有档案及目录(ls内定将档案名或目录名称为"."的视为影藏,不会列出): ls -l 以长格式显示目录下的内容列表.输 ...

  9. linux下mkdir头文件_Linux中判断一个目录是否存在,如果不存在就创建这个目录

    在操作文件目录时我们常常会考虑如下的功能: 1.判断文件是否存在,并判断文件是否可写/目录是否存在 Linux下: #include int access(const char* pathname, ...

最新文章

  1. 关于软件开发环境的思考
  2. 大家都收藏了的最新开源项目Top12!CV、NLP、机器学习一应俱全
  3. JDK工具jstatd用法详解(转)
  4. Javascript学习笔记1 数论
  5. 用仿ActionScript的语法来编写html5——第三篇,鼠标事件与游戏人物移动
  6. 【codevs1039】01年noip TG--数的划分满分dp+愚蠢深搜+pas的奇怪做法
  7. xbanner 动画特效设置android,Axure教程:如何实现爱彼迎App首页Banner的切换效果
  8. 开源运维管理软件排名_企业运维监控平台架构设计与实现(ganglia篇)
  9. DBGrid 应用全书
  10. 山东大学计算机专业毕业后,儿子被山东大学数学系录取,毕业之后的前景将会如何...
  11. 字符编码ASCII ,Unicode ,UTF-8
  12. 如何安装Catfish(鲶鱼)
  13. kmeans算法中的sse_kmeans算法理解及代码实现
  14. 等比数列求和公式、性质
  15. php fpm 测试,php-fpm – 配置详解(转)
  16. idea Ctrl+Alt+T 快捷键失效、无法弹出surround with、与qq热键冲突-解决办法
  17. IPHONE开发 VIEW之间的相互切换
  18. tbf格式用什么打开_TBF的完整形式是什么?
  19. 用Visio做工作流程图
  20. Android:WebView加载url网页显示不完整解决办法

热门文章

  1. VS2022打开Device Explorer报错
  2. 基于JavaScript+Koa2实现 Echarts 电商平台数据可视化大屏全栈【100010415】
  3. python编译器acanda_用python做生信分析
  4. 如果t是整数用c语言表达式,C语言程序设计习题及习题参考答案 任文 孔庆彦 全书习题及习题参考答案 第2章 C程序设计的初步知识.pdf...
  5. html div导出pdf,使用Javascript从div中的HTML生成pdf
  6. 手把手教你撸touchgfx的数字键盘(一)
  7. 飞桨开源社区携手开源之夏,邀你一起走进2023开源季!
  8. Python 的 Magic Method
  9. 使用Navicat给Oracle添加数据库和用户
  10. E11000 duplicate key error collection: *** index: _id_ dup key