C++併發程式設計框架Theron(7)——Theron中包含的類(一)
1 前言
前面的文章我先後介紹了Theron框架的理論,然後又介紹了Theron框架的實踐與幾個例項。當然,官方網站中還有很多值得學習的小案例的介紹,此外如果你想自己除錯更多小程式開源庫中也有對應的工程,我也不再過多的講解。從本篇博文開始,我會簡要說明一下Theron框架中包含的類,函式等。
2 Theron::Actor類
2.1 簡介
Actor是actor的基礎類,Theron中所有的actors的構建都必須繼承自該類。它提供actor的核心功能,比如註冊訊息處理函式和傳送訊息來回應收到來自其他actors的訊息。當完成從該基礎類派生,我們可以呼叫基礎類中各種protected方法。
儘管繼承的actors類可以直接在使用者程式碼中被構造,但是他們還是需要與一個Framework繫結,從而來管理與執行它們。這個Framework同時在構造的時候提供給Actor基礎類。,形式如下:
class MyActor : public Theron::Actor
{
public:
MyActor(Theron::Framework &framework) : Theron::Actor(framework)
{
}
};
一個Actor模型的基本原則是actors應該僅可以通過訊息通訊。因為Theron中的Actors還是以C++類的形式繼承自Actor基礎類,你在實際中也可能增加傳統成員方程來繼承actor類,從而打破Actor模型的抽象化。但是這種行為應該被避免,因為它會造成程式碼非常“ugly”,並且存在共享記憶體的問題,從而再引入傳統執行緒同步的問題。我們要忍受住為一個actor類增加一個方法,儘可能通過增加一個訊息來替代。
2.2 公共的成員函式
// 顯示建構函式
Actor (Framework &framework, const char *const name=0)
// 基礎類虛解構函式
virtual ~Actor ()
// 返回actor的地址(地址第一無二)
Address GetAddress () const
// 返回一個管理該actor的framework引用
Framework & GetFramework () const
// 獲取目前這個actor訊息佇列中等待處理的訊息總數
uint32_t GetNumQueuedMessages () const
2.3 保護的成員函式
// 為一個具體的訊息型別註冊一個處理函式
template<class ActorType , class ValueType >
bool RegisterHandler (ActorType *const actor, void(ActorType::*handler)(const ValueType &message, const Address from))
// 登出一個之前註冊的訊息處理函式
template<class ActorType , class ValueType >
bool DeregisterHandler (ActorType *const actor, void(ActorType::*handler)(const ValueType &message, const Address from))
// 檢測是否跟定的訊息處理函式被該actor所註冊
template<class ActorType , class ValueType >
bool IsHandlerRegistered (ActorType *const actor, void(ActorType::*handler)(const ValueType &message, const Address from))
// 設定預設的訊息處理函式,用來執行沒有處理的訊息
template<class ActorType >
bool SetDefaultHandler (ActorType *const actor, void(ActorType::*handler)(const Address from))
// 設定預設訊息處理函式,用來執行沒有處理的訊息的過載
template<class ActorType >
bool SetDefaultHandler (ActorType *const actor, void(ActorType::*handler)(const void *const data, const uint32_t size, const Address from))
// 給一個給定地址的實體(actor或者Receiver)傳送一條訊息
template<class ValueType >
bool Send (const ValueType &value, const Address &address) const
3 Theron::Address類
3.1 簡介
一個擁有第一無二地址的實體可以傳送或者接收訊息。地址在Theron中是所有實體獨一無二的名稱,可以接收訊息。我們知道一個實體的地址,也就足夠給它傳送訊息,並且不需要其他特殊的許可或者要求。
在Theron中實體的型別擁有地址,並且可以接收訊息,就是actors和receivers。這兩種型別的實體在構造的時候就被自動分配了獨一無二的地址。
地址可以被拷貝和分配,允許actors和receivers的地址在訊息中被髮送傳遞。(但是現在還不可以通過傳送給遠方的actors,因為它們不可以通過memcpy被拷貝)。
3.2 公共的成員函式
// 預設建構函式
Address ()
// 顯示建構函式
Address (const char *const name)
// 拷貝建構函式
Address (const Address &other)
// 賦值運算子
Address & operator= (const Address &other)
// 獲取識別framework包含該實體的整數index
uint32_t GetFramework () const
// 獲取地址的值為一個string
const char * AsString () const
// 獲取地址的值為一個unsigned 32位整數型
uint32_t AsInteger () const
// 獲取地址的值為一個unsigned 64位整數型
uint64_t AsUInt64 () const
// 等號運算子
bool operator== (const Address &other) const
// 不等號運算子
bool operator!= (const Address &other) const
Inequality operator. More...
// 小於號運算子
bool operator< (const Address &other) const
3.3 靜態公共的成員函式
// 靜態方法,用來返回第一無二的'null'地址
static const Address & Null ()
4 Theron::AllocatorManager類
4.1 簡介
這是一個管理記憶體分配的靜態類。勒種靜態方法SetAllocator和GetAllocator 允許非配器被Theron設定和回收。設定這個記憶體分配器是用來取代DefaultAllocator,而DefaultAllocator的功能是如果沒有傳統的分配器被顯示設定則會呼叫它。GetAllocator方法返回一個指向當前設定的分配器的指標,這個分配器可能是之前通過SetAllocator設定的,或者是DefaaultAllocator類的一個例項(當沒有任何分配器被設定)。使用參考如下,其實我們不是很常用到。
class MyAllocator : public Theron::IAllocator
{
public:
MyAllocator();
virtual ~MyAllocator();
virtual void *Allocate(const SizeType size);
virtual void *AllocateAligned(const SizeType size, const SizeType alignment);
virtual void Free(void *const memory);
virtual void Free(void *const memory, const SizeType size);
};
MyAllocator allocator;
Theron::AllocatorManager::SetAllocator(&allocator);
SetAllocator方法可以在應用程式初始至多被呼叫一次。如果DefaultAllocator被一個傳統分配器所取代,那麼這個取代操作必須是在應用的起始階段,必須在Theron物件(endpoints, frameworks,actors 和 receivers)構造之前。而GetAllocator在SetAllocator被呼叫之後就可以隨意的被多次呼叫了。
4.2 靜態公共成員函式
// 設定分配器取代預設分配器用於內部記憶體分配
static void SetAllocator (IAllocator *const allocator)
// 通過Theron獲取指向當前分配器的指標
static IAllocator * GetAllocator ()
// 獲取隱藏通用分配的快取分配的指標
static IAllocator * GetCache ()
5 Theron::Catcher< MessageType > 類别範本
5.1 簡介
template class Theron::Catcher< MessageType >這是一個特別實用的類别範本,是用來捕獲由Receiver收到的訊息,模板引數是捕獲的訊息型別,這個類在前面例項中有詳細的介紹過。
5.2 公共成員函式
// 預設建構函式
Catcher ()
// 解構函式
~Catcher ()
// 如果catcher沒有捕獲到任何訊息則返回true
bool Empty () const
// 推送一條訊息到訊息佇列中
void Push (const MessageType &message, const Address from)
// 獲取下一個捕獲的訊息,但是不會將其從佇列中移除
bool Front (MessageType &message, Address &from)
// 獲取下一個捕獲的訊息,並且會將其從佇列中移除
bool Pop (MessageType &message, Address &from)
6 小結
Theron框架其實並不是非常複雜,其包含的類也不是特別的多,一共僅有十餘個,剩下的後面博文再介紹。
以上是個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
轉載請註明出處:http://blog.csdn.net/FX677588/article/details/75330473
參考文獻:
Theron框架官網http://www.theron-library.com/
相關文章
- C++併發程式設計框架Theron(8)——Theron中包含的類(二)C++程式設計框架
- C++併發程式設計框架Theron(3)——Theron入門C++程式設計框架
- C++併發程式設計框架Theron(2)——Theron的五要素C++程式設計框架
- C++併發程式設計框架Theron(4)——Hello world!C++程式設計框架
- C++併發程式設計框架Theron(1)——Actor模型介紹C++程式設計框架模型
- C++併發程式設計框架Theron(5)——File reader(1)C++程式設計框架
- C++併發程式設計框架Theron(6)——File reader(2)C++程式設計框架
- 併發程式設計(一)——同步類容器程式設計
- disruptor - 併發程式設計框架程式設計框架
- Java併發程式設計中的設計模式解析(一)Java程式設計設計模式
- 《java併發程式設計的藝術》併發工具類Java程式設計
- Java 併發程式設計 Executor 框架Java程式設計框架
- 《java併發程式設計的藝術》併發容器和框架Java程式設計框架
- .NET 中的併發程式設計程式設計
- 併發程式設計(二)——併發類容器ConcurrentMap程式設計
- 《java併發程式設計的藝術》Executor框架Java程式設計框架
- Python中的併發程式設計Python程式設計
- java併發程式設計:Thread類的使用Java程式設計thread
- C++多程式併發框架FFLIBC++框架
- 鴻蒙程式設計江湖:併發程式設計基礎與鴻蒙中的任務併發鴻蒙程式設計
- 《java併發程式設計的藝術》原子操作類Java程式設計
- 【Java併發程式設計】一、為什麼需要學習併發程式設計?Java程式設計
- java併發程式設計的藝術筆記第八章——java中的併發工具類Java程式設計筆記
- 06.一文看懂併發程式設計中的鎖程式設計
- 併發程式設計面試必備:JUC 中的 Atomic 原子類總結程式設計面試
- Python併發程式設計之從效能角度來初探併發程式設計(一)Python程式設計
- Java 併發程式設計(八) -- AbstractQueuedSynchronizer中的NodeJava程式設計
- [譯]Go併發程式設計中的那些事Go程式設計
- Java併發程式設計:Thread類的使用介紹Java程式設計thread
- 併發程式設計程式設計
- 【Java併發程式設計】併發程式設計大合集-值得收藏Java程式設計
- 併發程式設計——基礎概念(一)程式設計
- 併發程式設計:DEMO:比較Stream和forkjoin框架的效率程式設計框架
- 使用Java 7.0的 Fork/Join框架進行併發程式設計Java框架程式設計
- 併發容器、框架、工具類框架
- Java 併發程式設計(十) -- ReentrantLock中的SyncJava程式設計ReentrantLock
- Java 併發程式設計(六) -- ThreadPoolExecutor中的WorkerJava程式設計thread
- Go 併發程式設計中的經驗教訓Go程式設計