首頁  >  文章  >  後端開發  >  C++ 多執行緒框架(1):new 一下就啟動一個執行緒

C++ 多執行緒框架(1):new 一下就啟動一個執行緒

黄舟
黄舟原創
2017-02-06 13:51:292069瀏覽

幾年前寫過一個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; 
 };


互斥基類,純虛函數定義了locklock和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,然後CLinuxOperratingSystemoopcreateThreadThread開始產生一個執行緒的執行函數。


對,就這麼簡單


在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);  
              
        }  
}
呼叫一句話new一下這個類別:

TestThread *a=new TestThread("Thread A");

OK,一切搞定,現在運行,就能不停的打出hello world了。

同樣,你也可以new多個實例

如果想要其他功能的線程,你再從CThread派生一個其他類別就行了,很簡單吧。


稍微複雜一點的是線程通信,下次說。

程式碼還沒整理完成,等整理完成了一併傳到github上,大概還需要兩三天時間吧。

github位址:

https://github.com/wyh267/Cplusplus_Thread_Lib

以上就是C++ 多執行緒框架(1):new 一下就啟動一個一個相關的內容,更多相關請注意網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:C++ 多執行緒下一篇:C++ 多執行緒