0

0

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

黄舟

黄舟

发布时间:2017-02-06 13:51:29

|

2209人浏览过

|

来源于php中文网

原创

几年前写过一个c++++的多线程框架,虽然写完了,但是人一懒做了一次说明以后就没影了,最近把代码整理了一下,准备发到github上,在这里,再把这个框架总结一下吧。

多线程一直是编程中常见的问题,特别是在Linux的c++上,多线程的封装一直不是很好,当然,有很多第三方库可以用,比如boost之类的,但是我们有时候并不需要那么庞大的库,只需要一个轻量级的线程框架就行了,于是自己编了一个,目前只在Linux下用了,但是设计的时候是按照多平台来编的,如果你有需要,可以自己添加一些个类,把他变成一个windows平台获取其他平台的,比如eCos,Vxworks等等。。

对于多线程,我们需要的是把操作系统底层封装起来,让用户编写程序的时候更多的关注他的代码逻辑而不是线程之间的逻辑,最好是new一个类以后,就启动了一个线程,线程之间的通信也有相应的类封装起来,只要调用就行了。

根据这些,我们定义了一组基类,来封装各种多线程的接口

操作系统基类,该类主要定义了createThread函数来创建线程,该函数是纯虚函数,继承自它的类需要根据平台实现其功能

立即学习C++免费学习笔记(深入)”;

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,那么线程就启动了,没有其他任何繁琐的操作。

要实现这样的功能,上面那些个类需要怎么样的组合调用呢?

凌夕卡密微商城
凌夕卡密微商城

卡密微商城支持三级分销,拥有唯一的推广链接,一次推广,三级奖励,可以查看下级会员统计信息,购买卡密之后自动显示卡密信息,无需等待,支持卡密充值、支付宝充值,可以在线提现。开发语言:JAVA开发框架:Struts2+Spring+Hibernate后台用到Freemarker模板引擎服务器环境:JDK1.7Tomcat7.0Mysql5.1演示网站用户名:admin,密码:222222安装教程:1、

下载

首先,因为是在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上,大概还需要两三天时间吧。

github地址:

https://github.com/wyh267/Cplusplus_Thread_Lib

以上就是C++ 多线程框架(1):new 一下就启动一个线程的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号