据我所知,活动对象设计模式是将一个(私有/专用)线程生命周期与一个对象捆绑在一起并使其在独立数据上工作.从我读到的一些文档中,这种范式的演变是由于两个原因,第一,管理原始线程会很痛苦,第二个争用共享资源的线程使用互斥锁和锁定不能很好地扩展.虽然我同意第一个原因,但我并不完全理解第二个原因.使对象处于活动状态只会使对象独立,但是锁定/互斥锁争用等问题仍然存在(因为我们仍然有共享队列/缓冲区),该对象只是将共享责任委派给消息队列.我看到的这种设计模式的唯一优势是我必须在共享对象上执行长的异步任务(现在我只是将消息传递给共享队列,线程不再需要在互斥锁上长时间阻塞/锁,但他们仍然会阻止并争夺发布消息/任务).除了这种情况,有人可以告诉更多场景,这种设计模式将具有其他优势.
我的第二个问题是(我刚刚开始挖掘设计模式),活动对象,反应堆和前驱设计模式之间的概念差异是什么.您如何确定哪种设计模式更有效并且更符合您的要求.如果有人能够展示某些示例来展示这三种设计模式将如何表现以及哪种模式在不同场景中具有比较优势/劣势,那将是非常好的.
我有点困惑,因为我使用了活动对象(使用共享线程安全缓冲区)和boost :: asio(Proactor)来做类似的异步内容,我想知道是否有任何人对适用性有更多见解接近问题时的不同模式
解决方法
ACE website在
Active Object,Proactor和
Reactor设计模式上有一些非常好的论文.他们的意图的简短摘要:
Active Object设计模式解耦方法执行
从方法调用到增强并发性和
简化对驻留在其中的对象的同步访问
自己的控制线程.又称:Concurrent Object,Actor.
Proactor模式支持解复用和调度
多个事件处理程序,由完成触发
异步事件.这种模式在Boost.Asio中大量使用.
Reactor设计模式处理传递的服务请求同时由一个或多个客户端的应用程序.每项服务在一个应用程序中可能包含几种方法,并由一个单独的事件处理程序,负责调度特定于服务要求.也称为:Dispatcher,Notifier.