C++ 并发编程的一种思维
作者:网络转载 发布时间:[ 2012/11/28 10:29:26 ] 推荐标签:
一个详细的例子
我们再来看一个详细的例子,借此了解 Theron 带来的便利。生产者消费者的问题是一个经典的线程同步问题,我们来看看 Theron 如何解决这个问题:
#include <stdio.h>
#include <Theron/Framework.h>
#include <Theron/Actor.h>
const int PRODUCE_NUM = 5;
class Producer : public Theron::Actor
{
public:
inline Producer(): m_item(0)
{
RegisterHandler(this, &Producer::Produce);
}
private:
// 生产者生产物品
inline void Produce(const int& /* message */, const Theron::Address from)
{
int count(PRODUCE_NUM);
while (count--)
{
// 模拟一个生产的时间
#ifdef _MSC_VER
Sleep(1000);
#else
sleep(1);
#endif
printf("Produce item %d
", m_item);
if (!Send(m_item, from))
printf("Failed to send message!
");
++m_item;
}
}
// 当前生产的物品编号
int m_item;
};
class Consumer : public Theron::Actor
{
public:
inline Consumer(): m_consumeNum(PRODUCE_NUM)
{
RegisterHandler(this, &Consumer::Consume);
}
private:
inline void Consume(const int& item, const Theron::Address from)
{
// 模拟一个消费的时间
#ifdef _MSC_VER
Sleep(2000);
#else
sleep(2);
#endif
printf("Consume item %d
", item);
--m_consumeNum;
// 没有物品可以消费请求生产者进行生产
if (m_consumeNum == 0)
{
if (!Send(0, from))
printf("Failed to send message!
");
m_consumeNum = PRODUCE_NUM;
}
}
int m_consumeNum;
};
int main()
{
Theron::Framework framework;
Theron::ActorRef producer(framework.CreateActor<Producer>());
Theron::ActorRef consumer(framework.CreateActor<Consumer>());
if (!framework.Send(0, consumer.GetAddress(), producer.GetAddress()))
printf("Failed to send message!
");
// 这里使用 Sleep 来避免主线程结束
// 这样做只是为了简单而并不特别合理
// 在实际的编写中,我们应该使用 Receiver
#ifdef _MSC_VER
Sleep(100000);
#else
sleep(100);
#endif
return 0;
}
生产者生产物品,消费者消费物品,它们并行进行,我们没有编写创建线程的代码,没有构建共享内存,也没有处理线程的同步。这一切都很轻松的完成了。
代价和设计
和传统的多线程程序相比 Theron 有不少优势,通过使用 Actor,程序能够自动的并行执行,而无需开发者费心。Actor 总是利用消息进行通信,消息必须拷贝,这也意味着我们必须注意到,在利用 Actor 进行并行运算的同时需避免大量消息拷贝带来的额外开销。
Actor 模型强调了一切皆为 Actor,这自然可以作为我们使用 Theron 的一个准则。但过多的 Actor 存在必然导致 Actor 间频繁的通信。适当的使用 Actor 并且结合 Object 模型也许会是一个不错的选择,例如,我们可以对系统进行适当划分,得到一些功能相对独立的模块,每个模块为一个 Actor,模块内部依然使用 Object 模型,模块间通过 Actor 的消息机制进行通信。
Theron 的未来
Theron 是个有趣的东西,也许你没有使用过它,你也不了解 Actor 模型,但是 Actor 的思想却不新鲜,甚至你可能正在使用。目前来说,我还没有找到 Theron 在哪个实际的商业项目中使用,因此对 Theron 的使用还存在一些未知的因素。还有一些特性,诸如跨主机的分布式的并行执行是 Theron 不支持的,这些都限制了 Theron 的使用,不过作者正在积极的改变一些东西(例如,作者表示会在今后添加 Remote Actors)。无论 Theron 未来如何,Theron 以及 Actor 模型带来的思想会让我们更加从容面对多核的挑战。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11