幾年前寫過一個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上,大概還需要兩三天時間吧。
github地址:
https://github.com/wyh267/Cplusplus_Thread_Lib
以上就是C++ 多線程架構(1):new 一下就啟動一個線程的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!