是否使用Active对象?

问题描述 投票:0回答:2
据我了解,主动对象设计模式是将(私有/专用)线程生命周期与对象绑定在一起,并使其在独立数据上工作。从我读到的一些文档来看,这种范例的演变有两个原因,首先,管理原始线程会很痛苦,其次,更多线程争夺共享资源不能很好地使用互斥锁和锁来扩展。虽然我同意第一个原因,但我不完全理解第二个原因。使对象处于活动状态只会使对象独立,但诸如锁/互斥争用之类的问题仍然存在(因为我们仍然有共享队列/缓冲区),对象只是将共享责任委托给消息队列。正如我所看到的,这种设计模式的唯一优点是我必须在共享对象上执行长时间异步任务的情况(现在我只是将消息传递到共享队列,线程不再需要在互斥体/上长时间阻塞)锁,但它们仍然会阻塞并竞争发布消息/任务)。除了这个案例之外,有人可以告诉更多场景,这种设计模式将具有其他优势。

我的第二个问题是(我刚刚开始挖掘设计模式),活动对象、反应器和前摄器设计模式之间的概念区别是什么。您如何决定哪种设计模式更有效并且更适合您的要求。如果有人能够演示某些示例,展示三种设计模式的行为方式以及哪一种在不同场景下具有比较优势/劣势,那就太好了。

我有点困惑,因为我使用了活动对象(使用共享线程安全缓冲区)和 boost::asio(Proactor) 来执行类似的异步操作,我想知道是否有人对此有更多见解解决问题时不同模式的适用性。

c++ design-patterns boost-asio reactor active-objects
2个回答
6
投票

ACE 网站 有一些关于 Active ObjectProactorReactor 设计模式的非常好的论文。他们的意图的简短摘要:

活动对象设计模式解耦方法执行 从方法调用到增强并发性和 简化对驻留在其中的对象的同步访问 自己的控制线程。也称为:并发对象、Actor。

Proactor模式支持解复用和调度 多个事件处理程序,由完成触发 异步事件。这种模式在 Boost.Asio 中大量使用。

Reactor设计模式处理交付的服务请求 一个或多个客户端同时提交一个应用程序。每项服务 一个应用程序中可能包含多种方法,并表示为 一个单独的事件处理程序,负责调度特定于服务的事件 要求。也称为:调度程序、通知程序。


© www.soinside.com 2019 - 2024. All rights reserved.