0

我正在尝试实现Active Object 模式。在所有示例实现中,ActivationQueue 正在同步对消息队列的访问。我在想为什么要在这个班级里完成。为什么调度程序不同步对 ActivationQueue 的访问。它是唯一访问此 ActivationQueue 对象的对象。同步在这里可以非常简单。问题是 - 在调度程序或 ActivationQueue 本身内同步访问 ActivationQueue 的更好位置是什么?

谢谢

4

2 回答 2

0

在 QP/C++ 活动对象框架 ( http://www.state-machine.com/qp ) 中,这更简单。每个活动对象都拥有自己的事件队列,只要活动对象线程为空,该队列就会阻塞活动对象线程。当一个事件发布到活动对象队列时,队列解除阻塞。如果以这种方式解除了多个活动对象的阻塞,则调度留给底层多任务内核。这意味着活动对象可以根据分配给活动对象线程的优先级自由地相互抢占。这种方法干净、简单,并且正是 UML 规范所建议的在活动对象中处理 RTC(运行到完成)处理的方式。具体实现见 P-thread 版本,http://www.state-machine.com/linux/或 Win32 版本在http://www.state-machine.com/win32)。

于 2013-04-23T02:49:57.610 回答
0

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

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