1 前言
本篇文章主要接着上一篇来介绍Theron框架库中包含的类。上一篇中主要介绍了Theron下Actor,Address,AllocatorManager和Catcher类,在本篇文章中我会相继介绍DefaultAllocator,EndPoint(包含Parameters),Framework(包含Parameters),IAllocator和Receiver类,其中最常用的是Framework和Receiver。
2 Theron::DefaultAllocator类
2.1 简述
该类是一个默认的通用内存分配器,它是扩展自C++中运算符new和delete来支持一致分配功能,分配统计,和磁盘保护区检测。
DefaultAllocator是Theron内部进行内存分配的类,除非它被通过AllocatorManager::SetAllocator(上一篇博文中有详细介绍)设置一个定制的分配器所替代。如果你需要的话,DefaultAllocator也可能被用来在用户应用代码中作为分配器。我们可以通过AllocatorManager::GetAllocator来取出使用。由于它并不是特别常用,这里也不再做详细的介绍,感兴趣可以查看官网的介绍。
3 Theron::EndPoint类
3.1 简述
这是网络通信对象,能够与其他线程以及远程主机(分布式编程)上的actors通信。该类的单实例必须在每个应用中被构造,然后意图使用于一堆用于分布式计算的分布式应用中。如果一个Endpoint被创立,它必须比它相关联的frameworks,actors和receivers“活”的更长。包含它的头文件是#include <EndPoint.h>
。
3.2 公共的成员函数
// 显式构造函数
EndPoint (const char *const name, const char *const location, const Parameters params=Parameters())
// 析构函数
~EndPoint ()
// 获取EndPoint事例的名称
const char * GetName () const
// 连接该Endpoint对象和其他(例如远程)的EndPoint对象
bool Connect (const char *const address)
3.3 Theron::EndPoint::Parameters类
这个Prameters结构可以传给EndPoint构造函数。目前该类还是空作为未来的扩展。
4 Theron::Framework类
4.1 简述
好了,终于到了我们除了Actor类之外第二重要的类了,它是一个管理类,用来主持,管理和执行actors。我们应该在创建任何actors之前,在非actor应用代码中构建一个Framework实例。Actor对象接着可以在构造函数中通过传递framework作为一个参数给actor基类来被创建,如下:
class MyActor : public Theron::Actor
{
public:
explicit MyActor(Theron::Framework &framework) : Theron::Actor(framework)
{
}
};
Theron::Framework framework;
实际上,每个framework包含一个线程池,用来执行actors中创建的消息处理函数。一个framework中的线程用来执行其包含的actors,并且不能用来执行其他frameworks中的actors。工作线程的初始数量可以通过一个现实参数传递给 Framework::Framework构造器,在构造该framework的时候给出。此外,线程的数量可以通过调用 SetMinThreads或者SetMaxThreads在程序执行期间增加或者减少。 GetCounterValue可以查询当前使能线程的使用情况。
工作线程可以使用当前系统中存在的线程对象来创建和同步。这些线程对象的不同实现让Theron使用在不同线程基元,这些都是可以可以提前预设的。
我们可以在一个应用中构造多个Framework对象。每个Framework中的actors可以被单独的工作线程池所处理。一个framework中的Actors可以发送消息给其他framework中的actors,但是它只能被它所属的framework的线程池执行。
4.2 简述
// 构造函数1
Framework (const uint32_t threadCount)
// 设置参数的构造函数2
Framework (const Parameters ¶ms=Parameters())
// 构造函数3
Framework (EndPoint &endPoint, const char *const name=0, const Parameters ¶ms=Parameters())
// 析构函数
~Framework ()
// 发送一条消息给某个实体(例如actor)
template<typename ValueType >
bool Send (const ValueType &value, const Address &from, const Address &address)
// 限制该framework中工作线程的最大数量
void SetMaxThreads (const uint32_t count)
// 限制该framework中工作线程的最小数量
void SetMinThreads (const uint32_t count)
// 返回当前限制的最大工作线程数量
uint32_t GetMaxThreads () const
// 返回当前限制的最大工作线程数量
uint32_t GetMinThreads () const
// 获取当前framework中实际工作线程的数量
uint32_t GetNumThreads () const
// 获取framework中活跃的工作线程的峰值数
uint32_t GetPeakThreads () const
// 设置通过GetCounterValue查询的可接近的counters的总数
uint32_t GetNumCounters () const
Returns the number of counters available for querying via GetCounterValue. More...
// 返回给定索引的counters字符串名称
const char * GetCounterName (const uint32_t counter) const
// 重启framework中所有内部事件counters
void ResetCounters ()
// 获取一个具体事件counter的当前值
uint32_t GetCounterValue (const uint32_t counter) const
// 获取当前一个具体事件counter的每个线程值
uint32_t GetPerThreadCounterValues (const uint32_t counter, uint32_t *const perThreadCounts, const uint32_t maxCounts) const
// 设置没有对应处理函数的消息的后备消息处理函数
template<typename ObjectType >
bool SetFallbackHandler (ObjectType *const actor, void(ObjectType::*handler)(const Address from))
// 设置没有对应处理函数的消息的后备消息处理函数
template<typename ObjectType >
bool SetFallbackHandler (ObjectType *const actor, void(ObjectType::*handler)(const void *const data, const uint32_t size, const Address from))
5 Theron::IAllocator类
5.1 简述
它是一个通用的内存分配器的接口。这个接口类定义了Theron使用的分配器的期望接口。它可以通过之前介绍的AllocatorManager::SetAllocator来描述分配器类型的特征。
我们通过IAllocator接口作用在在一个定制的分配器上,用户可以提供一个定义分配器应用在Theron中。当通过AllocatorManager::SetAllocator设置完成,DefaultAllocator就会在Theron中被取代使用。当默认分配器被成功取代,用户就可以控制,隐藏,或者优化Theron中内存的分配器。Theron中所有内部堆空间都是通过使用AllocatorManager::SetAllocator分配,和任何Theron对象被构建前分配器被设置一样。
5.2 公共的成员函数
// 默认构造函数
IAllocator ()
// 虚拟析构函数
virtual ~IAllocator ()
// 分配一块相邻的内存
virtual void * Allocate (const SizeType size)=0
// 分配一块对齐于多字节边界的给定的相邻内存
virtual void * AllocateAligned (const SizeType size, const SizeType)
// 释放一块之前申请的相邻的内存
virtual void Free (void *const memory)=0
// 释放一块之前申请的已知尺寸大小的相邻内存
virtual void Free (void *const memory, const SizeType)
6 Theron::Receiver类
6.1 简述
Receiver是一个和actor一样有自己独立地址的独立实体,可以接收actor发送的消息。包含它的头文件是#include <Receiver.h>
,一个receiver可以在非actor用户代码中被实例化,例如main()函数中等。
Receiver此外还可以提供注册消息处理函数来处理它们接收到的消息,这个和actor的功能一样。它允许拥有它的线程注册回调性质的消息处理函数,当收到注册的类型信息则该消息函数自动执行。我们可以通过Receiver::Wait来同步收到的消息,消息处理函数的结果只有在消息收到之后才会被执行。
6.2 公共的成员函数
// 默认构造函数
Receiver ()
// 有参构造函数
Receiver (EndPoint &endPoint, const char *const name=0)
// 析构函数
~Receiver ()
// 返回receiver的独一无二的地址
Address GetAddress () const
// 为某个类型消息注册一个消息处理函数
template<class ClassType , class ValueType >
bool RegisterHandler (ClassType *const owner, void(ClassType::*handler)(const ValueType &message, const Address from))
// 析构一个之前的注册函数
template<class ClassType , class ValueType >
bool DeregisterHandler (ClassType *const owner, void(ClassType::*handler)(const ValueType &message, const Address from))
// 重置未处理的消息总数为0
void Reset ()
// 返回未处理的消息总数
uint32_t Count () const
// 一直等到接收到消息
uint32_t Wait (const uint32_t max=1)
// 消耗消息,直到达到限制的个数
uint32_t Consume (const uint32_t max)
7 小结
和上一篇博文一起,我们学习了Theron框架中所有的类的用处与包含的类方法。它们是Theron框架的程序基础,当然只有多多实践我们才能体会它们的真正用处。希望大家多跑跑官网给出的许多案例程序,只有通过实践我们才能很好的体会到Theron真正的魅力!
以上是个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
转载请注明出处:http://blog.csdn.net/FX677588/article/details/74359823
参考文献:
Theron框架官网http://www.theron-library.com/