跨平台並行庫的初步設計

2021-05-22 15:22:29 字數 2065 閱讀 6710

上篇日誌提到我想用 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()  是我寫的幾個例子,通過這幾個例子可以更容易理解我的設計意圖。

void task1();    

struct task2

;

struct task3

;

typedef loki::functor<> serialtask;

class paralleltask

;

serialtask subtask1(task1); // subtask1物件將會執行task1()函式。

task2 t2;

serialtask subtask2(t2); // subtask2物件將會執行t2(),也就是執行t2::operator()。

task3 t3;

serialtask subtask3(&t3, &task3::memberfun); // subtask3物件將會t3.memberfun()。

serialtask subtask1_2(chain(subtask1, subtask2)); //subtask1_2物件將會序列執行subtask1和subtask2,也就是先執行task1(),接著執行t2::operator()。

serialtask subtask1_2_3(chain(subtask1_2, subtask3)); //subtask1_2_3物件將會序列執行subtask1、subtask2和subtask3,也就是先執行task1(),接著執行t2::operator(),最後執行t3.memberfun()。

// 此函式通過呼叫subtask1_2_3()來序列執行任務1,2,3

void sample1_2_3()

// 此函式表示先執行任務1,然後並行執行任務2和3

void sample1_23()

// 此函式表示並行執行任務1,2和3

void sample123()

GameFramework的初步設計

最近這幾天在搞乙個gameframework,其實就是在引擎基礎上增加乙個遊戲框架,對遊戲進行抽象,對引擎使用的一些封裝。在進行具體設計的時候很多細節問題是值得思考的。總結如下 總的來說我所設計的遊戲框架從功能上來講就是兩件事,乙個是遊戲的狀態管理 什麼選單狀態,遊戲狀態等等 在乙個就是ai管理,又...

關於微服務架構的許可權控制初步設計

最近開發的系統是前後端分離 微服務分布式架構,不同於單體應用的許可權身份校驗機制,前後端分離的情況下,無法直接確認前端請求者的身份許可權,需要通過第三方鑑權中心來操作,身份校驗較為簡單,直接過濾網關級別的請求即可,但是許可權校驗就比較複雜了。資源 物件 樞紐 整體關係如下 物件通過樞紐進行資源的許可...

談談跨鏈平台BitXHub的架構設計

我們和跨鏈技術的緣分從乙個客戶需求開始 在養老金行業的區塊鏈應用中我們遇到了乙個跨鏈的需求,乙個客戶使用趣鏈聯盟鏈構建了乙個養老金鏈,同時另一方客戶則使用fabric構建了另乙個區塊鏈服務,他們所做的業務分別位於養老金業務流程中的兩個不同階段,參與的機構和使用者也不盡相同,為了從底層開始打通這兩個區...