跨平臺並行庫的初步設計

上篇日誌提到我想用 ACE Loki 庫設計一個類似 OpenMP 的並行庫,前兩天仔細想了想,勾勒出了大體的框架,以供討論;)

   看下面代碼之前,首先要熟悉 Loki 庫裏面對 Functor 模板類的使用(《 C++ 設計新思維》一書有詳細描述,不過看此書要做好心理準備:)),否則看了也是一頭霧水; ACE 的部分暫未描述出來,先將其隱藏在 ParallelTask 類當中,所以對 ACE 不瞭解也沒關係。


             結合下面代碼,先把各個類的功能說一下:
              (1) 函數Task1、仿函數Task2和類Task3中的成員函數 這三種形式基本列出了C++中具有函數功能的幾種表示形式,而執行一個函數就是執行一項任務。下面都將以任務的概念來描述串行和並行。另外,這裏返回值都 用了void,並且沒有傳入傳出參數是因爲這些都是抽象出來的概念,最終總是有辦法把任務抽象到這幾種形式的。
            
              (2)關於typedef  Loki::Functor<> SerialTask,這裏用了 Loki::Functor<>,詳細的我不解釋了,看書吧,大概的用處就是用了這個模板類,可以把上面三種(實際有更多)函數形式完美的包裝進去,令函數執行 預 備工作(準備對象和輸入參數等等這些事情)和執行過程(就是執行函數體)分離開來,這樣我們就可以把任務的準備期和執行期很好的分離,方便宏觀設計。如果 瞭解設計模式中的Command模式,應該會很快領悟到。另外利用一個Chain模板函數,此模板類還可以把各個任務方便的串行起來,以實現串行功能,故 在此將其typedef爲 SerialTask。
            
              (3)關於類
ParallelTask ,顧名思義,這個類就是具有並行功能類,我可以通過其PushTask成員函數方便的把任務塞給它,這些任務都將並行執行。而讓它們何時執行,可以通過調用 operator()來觸發。此類也可以當作一個任務(由衆多小任務組成)來看待,而且有了operator(),也可以方便的交由SerialTask對象來將它與其它任務串行起來。這個類背後的實現會用到ACE,因爲ACE本身具有很強大的跨平臺的多線程庫。

              (4)
Sample1_2_3() 、 Sample1_23()  、Sample1_23() 、 Sample123()  是我寫的幾個例子,通過這幾個例子可以更容易理解我的設計意圖。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章