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

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

    

几年前写过一个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一、基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的平台不同&…

python正则表达式试题_正则表达式练习题2

1、匹配一行文字中的所有开头的字母内容#codingutf-8import res"i love you not because of who you are,but because of who i am when i am with you"contentre.findall(r"\b\w",s)print contentc:\Python27\Scripts>python task_test.py[‘i‘,‘l‘…

Knowladge_网站学习_jQuery插件

几个参考的jquery插件网站 1. 240 多个jQuery 插件              http://www.cnblogs.com/Terrylee/archive/2007/12/09/the-ultimate-jquery-plugin-list.html 2. 1587款jQuery 插件开源软件            http://www.oschina.net/project/tag/273/jque…

C语言求斐波那契数列

一.递归算法 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int fib(int k) {if (k < 2)return 1;elsereturn fib(k - 1) fib(k - 2); } int main() {int n 0;int res 0;printf("求输入斐波那契数列的阶数");scanf("%d", &n);res…

CMFCRibbonStatusBar中添加图片按钮

今天遇到了问题&#xff0c;网上down的 Heres how it works: 1. Create aCMFCRibbonButtonsGroup that will hold the status icon and add it to CMFCRibbonStatusBar 2. Create a CMFCToolBarImagesobject and add status icons via AddIcon() . 3. Register theCMFCToolbarI…

nodejs中path的用法

在用nodejs进行开发的时候&#xff0c;常常要进行复杂的路径判断。对于我这种刚开始接触模块化开发的小白来说&#xff0c;实在是浪费很多宝贵的脑细胞&#xff08;找路径bug&#xff09;。 node中的path模块帮助我们方便的解决了路径设置问题。 首先将path模块引入 require(pa…

nginx $mail-send()发送邮件报错_基于SMTP协议的E-MAIL电子邮件发送客户端软件C#实现...

摘 要电子邮件在当今社会中扮演了一个很重要的角色。越来越多的人在使用它。而且用它的人数势必会继续增加。虽然&#xff0c;现在已经有很多的邮件收发软件例如著名的FoxMail 但是对于大多数的非专业的人来说它还是有点难度稍嫌负责。因此&#xff0c;我们就利用SMTP和Pop协议…

C语言求n的阶乘

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int fact(int k) {if (k > 1)return k * fact(k - 1);elsereturn 1; } int main() {int n 0;int num 0;printf("请输入一个正整数n,求n!");scanf("%d", &n);numfact(n);printf("…

oracle11g 隐藏参数_ORACLE 11GR2常用参数(含隐含参数)设置

ORACLE 11GR2常用参数(含隐含参数)设置如下&#xff1a;alter system set "_PX_use_large_pool" true scopespfile;alter system set "_clusterwide_global_transactions" false scopespfile;#RAC环境 https://www.sohu.com/a/152628320_505827alter sys…

【转】DCT变换的透彻解析

3、离散余弦变换 DCT  将图像从色彩域转换到频率域&#xff0c;常用的变换方法有&#xff1a;DCT变换的公式为&#xff1a;f(i&#xff0c;j) 经 DCT 变换之后&#xff0c;F(0&#xff0c;0) 是直流系数&#xff0c;其他为交流系数。  还是举例来说明一下。  8x8的原始图…

使用git pull文件时和本地文件冲突怎么办?

Git常用命令 具体方法如下 git pull origin 分支//出现错误git stash 缓存起来git pull origin 分支git stash pop //还原git stash clear 开发人员常常遇到这种情况&#xff1a;花了几天时间一直在做一个新功能&#xff0c;已经改了差不多十几个文件&#xff0c;突然有一个bu…

C语言计算字符串的长度

一。循环实现 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int my_strlen(char *pstr) {int num 0;while (*pstr ! \0){num;pstr;}return num; } int main() {int count 0;char str[100] { 0 };printf("请输入一个字符串");scanf("%s"…

Android 目录

Android 移动平台概述 1 Android平台简介 2 Android平台所提供的功能 3 Android框架简介 4 Android SDK 简介:包括一系列ANDROID应用开发工具和文档&#xff0c;包括调试器&#xff0c;库文件集&#xff0c;手机设备模拟器&#xff0c;文档&#xff0c;范例和开发指导。 5 An…

安防硬件WIZnet基于全硬件TCP/IP的安防产品应用及方案

在本文中,我们主要介绍安防硬件的内容,自我感觉有个不错的建议和大家分享下 WIZnet立足于生产全硬件TCP/IP协议栈芯片&#xff0c;为单片机提供理想的处置计划。整体来讲&#xff0c;其应用领域还是非常广泛的&#xff0c;以智能电表为代表的Smart Energy&#xff1b;以数字楼宇…

在屏幕上将1234逐位打印出来1,2,3,4

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void my_printf(int temp) {if (temp > 9)my_printf(temp / 10);printf("%d\n", (temp % 10)); } int main() {int num 0;printf("请输入一个数字:\n");scanf("%d", &num);…

联想将在CES上展示LePad平板

联想将在本周举行的CES展上展示其平板电脑LePad&#xff0c;迎战苹果的iPad和三星的Galaxy Tab。 联想曾经在去年的CES上展示了一款颇受瞩目的平板/笔记本混合型电脑IdeaPad U1&#xff0c;原计划在去年下半年推出&#xff0c;但因故推迟。LePad与U1平板并不相同&#xff0c;屏…

深入mysql慢查询设置的详解

深入mysql慢查询设置的详解在web开发中&#xff0c;我们经常会写出一些SQL语句&#xff0c;一条糟糕的SQL语句可能让你的整个程序都非常慢&#xff0c;超过10秒一般用户就会选择关闭网页&#xff0c;如何优化SQL语句将那些运行时间 比较长的SQL语句找出呢&#xff1f;MySQL给我…

编辑为什么建议转投_编辑回信解读 —“建议转投子刊”实例

​在给期刊投稿之后&#xff0c;首先是通过编辑审阅的&#xff0c;如果编辑这关过了才会把手稿分发给审稿人&#xff0c;进行审稿。编辑这关&#xff1a;(1)主要是对手稿的研究方向是否符合本期刊的定位&#xff1b;(2)格式、篇幅、排版等是否有重大错误或不符合期刊要求&#…

SetProcessWorkingSetSize 函数的骗局

SetProcessWorkingSetSize函数的骗局 本文引用自&#xff1a;http://hi.baidu.com/jenson138/item/e64e7e453c5b28e21381da9c 我实在不愿意提起这个话题.后来在网上看到几篇文章,深深感觉到,已经有程序员站出来,揭穿这个忽悠了千百万用户的诡计了...附2篇文章的地址:http://blo…