C++併發程式設計框架Theron(7)——Theron中包含的類(一)

無鞋童鞋發表於2017-07-18

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/

相關文章