之前笔者几篇文章介绍了改线程类的文章. 关联文章的地址

几年前写过一个C++的多线程框架,虽然写完了,但是人一懒做了一次说明以后就没影了,最近把代码整顿了一下,预备发到github上,在这里,再把这个框架总结一下吧。
多线程始终是编程中常见的问题,特别是在Linux的c++上,多线程的封装始终不是很好,当然,有很多第三方库可以用,比如boost之类的,但是我们有时候并不须要那么庞大的库,只须要一个轻量级的线程框架就好了,于是自己编了一个,现在只在Linux下用了,但是设计的时候是按照多平台来编的,如果你有须要,可以自己添加一些个类,把他酿成一个windows平台获得其他平台的,比如eCos,Vxworks等等。。
对于多线程,我们须要的是把操作系统底层封装起来,让用户编写程序的时候更多的存眷他的代码逻辑而不是线程之间的逻辑,最好是new一个类以后,就启动了一个线程,线程之间的通信也有相应的类封装起来,只要调用就好了。
根据这些,我们定义了一组基类,来封装各种多线程的接口
操作系统基类,该类主要定义了createThread函数来创立线程,该函数是纯虚函数,继承自它的类须要根据平台实现其功能
class COperatingSystem
{public:COperatingSystem();~COperatingSystem();virtual  bool createThread(CThread *mThread,unsigned long stack_size=8*1024)=0;virtual void  sleepSec(unsigned long sec)=0;protected:CThread      *p_thread;
};

线程基类,定义了threadEntry来作为线程的入口,initializeThread来初始化线程,子类可以初始化不同的成员变量,mainLoop是纯虚函数,为线程的主函数,一般是一个while循环,子类必须实现该虚函数。
class CThread
{public:CThread(const char *m_thread_name);~CThread();void threadEntry(CCountingSem *pSemaphore);protected:virtual bool initializeThread();virtual void mainLoop()=0;COperatingSystem      *p_opration_system;char     *p_thread_name;};

为了平台的无关性,使用了简略工厂模式,用来根据不同的平台返回不同的操作系统类,信号量类和互斥类。
class COperatingSystemFactory
{public:static COperatingSystem *newOperatingSystem();static CCountingSem  *newCountingSem(unsigned int init);static CMutex         *newMutex(const char *pName=NULL);};

信号量基类,纯虚函数定义了get和post信号量方法,子类必须根据系统类型进行不同的实现
class CCountingSem
{public:CCountingSem();~CCountingSem();virtual bool                Get(Mode mode = kForever, unsigned long timeoutMS = 0) = 0;virtual bool                Post(void) = 0;};

互斥基类,纯虚函数定义了lock和unlock两个方法,同样,子类必须根据系统类型进行不同的实现
class CMutex
{public:CMutex(const char *pName = NULL);~CMutex();virtual bool Lock()=0;virtual bool UnLock()=0;protected:char     *mutex_name;
};

每日一道理
时间好比一条小溪,它能招引我们奔向生活的海洋;时间如同一叶扁舟,它将帮助我们驶向理想的彼岸;时间犹如一支画笔,它会指点我们描绘人生的画卷。
还有一个重头是msgQueue类,下次说。
有了这些个基础类以后,我们就可以开始了。
我们希望的结果是
用户,也就是程序员啦,从CThread继承一个自己的线程类,比如CTestThread,然后实现mainLoop方法,这样,一个不考虑通信的线程就编写完了,然后我只须要在main.cpp中new一下这个CTestThread,那么线程就启动了,没有其他任何繁琐的操作。
要实现这样的功能,下面那些个类须要怎么样的组合调用呢?
首先,因为是在Linux下,所以全部的基类都要派生出Linux对应的子类(CThread不须要,因为是用户编写的,COperatingSystemFactory也不须要,因为是抽象工厂),所以,我们在Linux下创立了CLinuxMutex,CLinuxOperratingSystem,CLinuxCountingSem三个子类,并且在这些个子类中实现了基类中的纯虚函数。
接着,我们new 一个 CTestThread 后,须要通过COperatingSystemFactory的newOperatingSystem 生成一个CLinuxOperratingSystem,然后CLinuxOperratingSystem调用createThread发生一个线程函数,然后把CTestThread的mainLoop绑定到这个线程函数中。
对,就这么简略
在github中下载了全部的文件以后,你只须要编写你自己的线程类,如:
class TestThread:public CThread
{public:TestThread(const char *m_name);~TestThread();virtual void mainLoop();
};
//然后实现mainLoop方法:
void TestThread::mainLoop()
{while(1){printf("%s :hello world\n",p_thread_name);}
}

然后在main.cpp中,调用一句话new一下这个类:
TestThread *a=new TestThread("Thread A");

OK,一切搞定,当初运行,就可以不停的打出hello world了。
同样,你也可以new多个实例
如果想要其他功能的线程,你再从CThread派生一个其他类就好了,很简略吧。
略微庞杂一点的是线程通信,下次说。
代码还没有整顿完成,等整顿完成了一并传到github上,大概还须要两三天时间吧。

文章结束给大家分享下程序员的一些笑话语录: 人脑与电脑的相同点和不同点,人脑会记忆数字,电脑也会记忆数字;人脑会记忆程序,电脑也会记忆程序,但是人脑具有感知能力,这种能力电脑无法模仿,人的记忆会影响到人做任何事情,但是电脑只有程序软件。比尔还表示,人脑与电脑之间最重要的一个差别就是潜意识。对于人脑存储记忆的特别之处,比尔表示,人脑并不大,但是人脑重要的功能是联络,人脑会把同样的记忆存储在不同的地方,因此记忆读取的速度就不相同,而这种速度取决于使用的频率和知识的重要性。人脑的记忆存储能力会随着年龄增长而退化,同时记忆的质量也会随着年龄退化。经典语录网

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/22/3093760.html

线程类C++多线程框架(一)--------- new一下就启动一个线程相关推荐

  1. Java自学-多线程 启动一个线程

    Java 创建一个线程的三种方式 多线程即在同一时间,可以做多件事情. 创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类 步骤 1 : 线程概念 首先要理解进程(Process ...

  2. 多线程面试题之启动一个线程是run()还是start()?他们有什么区别

    3.启动一个线程是run()还是start()?他们有什么区别启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运 ...

  3. python 多线程 setdaemon_python使用Thread的setDaemon启动后台线程教程

    多线程编程当中, 线程的存在形态比较抽象. 通过前台线程后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现) 后台线程与前台线程的直接区别是, 1)setDaemon( ...

  4. JavaWeb 项目时 启动一个线程

    介绍:最近在项目中,需要在启动项目时启动一个线程进行业务操作,在网上查找资料后准备采取监听的实现方式. 1首先创建一个类MqMsgTransformationListener 集成ServletCon ...

  5. 关于启动一个线程监控队列的替代方案

    项目背景: 操作对象:一个定长的任务队列 队列状态:任务队列中的任务会在一定时间后完成,完成后需要移出队列,然后重新计算队列剩下的长度. 队列的操作大致分为两类: 一类是查询队列状态,看队列里面还剩下 ...

  6. 启动一个线程是用run()还是start()?

    启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个 线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码. 转载于:https://www.cnbl ...

  7. 设计两个个线程模拟存取款操作,其中一个线程每次随机存1~1000元钱,另外一个线程取1-1000元钱,如果余额不足,则取款失败,提示余额不足。写出程序(考虑并发问题)。

    设计两个个线程模拟存取款操作,其中一个线程每次随机存1~1000元钱, 另外一个线程取1-1000元钱,如果余额不足,则取款失败,提示余额不足. 写出程序(考虑并发问题). import java.u ...

  8. Thread线程类及多线程

    1.进程.线程.并发.并行是什么? 1)进程:操作系统中可以运行多个任务(程序),这些运行的任务(程序)被称为进程.程序的运行产生进程(内存空间.程序执行的堆栈),可以这样说,进程是作为操作系统分配资 ...

  9. Java并发编程—Thread类的start()方法是如何启动一个线程的?

    目录 一:Java线程介绍 二:Java线程入口分析 三:Java线程的创建 四:总结 周末抽了点时间,研究了下HotSpot是如何创建Java线程的,顺便总结一下.文中引用的源码里删除很多细节,只保 ...

最新文章

  1. 二维指针*(void **)的研究(uC/OS-II案例)
  2. lintcode:Singleton 单例
  3. LeetCode LCP 33. 蓄水(暴力枚举)
  4. Kafka 慌了!这个中间件,要火了?
  5. 20180326-1777-1.2-UMLDOC
  6. jQuery插件开发代码
  7. HTML5 前端原生 WebSocket 通信
  8. IDEA 打包、Spring Boot Maven plugin 打包可执行 Jar 程序
  9. linux中fb0和fb1同时显示数据,Linux frame buffer驱动设计与实现
  10. 螃蟹保存方法保存时间_活面包蟹怎么保存?面包蟹能保存多久
  11. 什么电子邮箱正式?企业工作邮箱大全,一般白领用什么邮箱账号?
  12. VMware虚拟机如何开启雷电模拟器的VT?
  13. git revert回退时提示One or more files are in a conflicted state
  14. 1 Linux Kali忘记用户名教程
  15. 【第二季】Arcgis地图制图基础|(一)Arcgis地图符号制作
  16. 用scratch3.0做游戏(1)
  17. win7下Matlab7打不开,显示javax.swing.borderEmptyBorder.init(Unknow Source)
  18. 做思维导图的软件有哪些?MindNow思维导图好用
  19. 什么是Android进程(app)保活、进程保活的方案
  20. HTML和JSP的区别,以及各自的优缺点

热门文章

  1. 为什么只有360公开支持华为系统,其他公司都不敢表态?
  2. 最新数据显示,全国有580万人被限制乘坐高铁,大家怎么看?
  3. Visual Studio 2008 Beta 2 VPC寿命延长
  4. FIFO IP设计说明
  5. Windows® CE 系统中的同步机制
  6. 一种User Mode下访问物理内存及Kernel Space的简单实现
  7. python括号的区别_Python中类-带括号与不带括号的区别
  8. mod游戏什么意思计算机,MOD运算
  9. GPU Gems1 - 14 透视阴影贴图(Perspective Shadow Maps: Care and Feeding)
  10. 基于springboot多模块项目使用maven命令打成war包放到服务器上运行的问题