活动对象 - 实施问题

时间:2013-04-22 03:29:29

标签: c++ design-patterns

我正在尝试实施Active Object pattern。 在所有示例实现中,ActivationQueue正在同步对消息队列的访问。我在想为什么在这堂课里完成。 为什么Scheduler没有同步对ActivationQueue的访问。它是访问此ActivationQueue对象的唯一对象。这里的同步非常简单。 问题是 - 在调度程序或ActivationQueue本身内同步访问ActivationQueue的更好的地方是什么?

谢谢

2 个答案:

答案 0 :(得分:0)

虽然你认为在Lavender和Schmidt的原始方法中只有调度程序访问队列是正确的,但是在队列中实现同步是更好的选择。 有两个原因:

  1. 同步保护对象是一个更清晰的设计,因为问题(可能的不一致)及其解决方案(同步)受到更好的约束。
  2. 有AO的实现,其中请求被直接调度到队列(由外部实体),并且调度程序“仅”决定重新排序。

答案 1 :(得分:0)

在QP / C ++活动对象框架(http://www.state-machine.com/qp)中,这样做更简单。每个活动对象拥有自己的事件队列,只要它是空的,该队列就会阻塞活动对象线程。将事件发布到活动对象队列时,队列将解除阻止。如果以这种方式解除阻塞多个活动对象,则将调度留给底层多任务内核。这意味着活动对象可以自由地相互抢占,具体取决于分配给活动对象的线程的优先级。这种方法简洁明了,而且UML规范建议如何处理活动对象中的RTC(运行到完成)处理。有关具体实现,请参阅http://www.state-machine.com/linux/处的P线程版本http://www.state-machine.com/win32或Win32版本。)