多线程一向是编程中常见的题目,特别是在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上,也许还须要两三天时候吧。
github地点:
https://github.com/wyh267/Cplusplus_Thread_Lib
以上就是C++ 多线程框架(1):new 一下就启动一个线程的内容,更多相关内容请关注ki4网(www.ki4.cn)!