幾年前寫過一個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); };
class CCountingSem { public: CCountingSem(); ~CCountingSem(); virtual bool Get(Mode mode = kForever, unsigned long timeoutMS = 0) = 0; virtual bool Post(void) = 0; };
class CMutex { public: CMutex(const char *pName = NULL); ~CMutex(); virtual bool Lock()=0; virtual bool UnLock()=0; protected: char *mutex_name; };
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); } }呼叫一句話new一下這個類別:
TestThread *a=new TestThread("Thread A");
OK,一切搞定,現在運行,就能不停的打出hello world了。
稍微複雜一點的是線程通信,下次說。
程式碼還沒整理完成,等整理完成了一併傳到github上,大概還需要兩三天時間吧。
github位址:https://github.com/wyh267/Cplusplus_Thread_Lib以上就是C++ 多執行緒框架(1):new 一下就啟動一個一個相關的內容,更多相關請注意網(www.php.cn)!