1

看过之前的项目中如何使用命令模式后,我可以理解它在多线程(并行)编程中的用途,因为命令可以在不同的线程中执行。当需要在命令之间传递数据时,可以将数据存储在共享内存中,并且可以将指向该数据的指针(或句柄)传递给不同线程上的调用程序。

然而,装饰器模式似乎有所有事情都必须发生在单个线程上的限制,因为装饰器必须直接调用委托,这意味着它们必须在同一个线程上。

我对这个限制的理解正确吗?相反,是否可以在多个线程上运行装饰器?


我正在尝试实现的是一个处理数据流的管道。

  • 要实现为命令模式,它的execute方法需要两个参数:输入缓冲区和输出缓冲区。
  • 为了实现装饰器模式,它的getdata方法将调用它的委托来获取上一步的结果,应用它自己的处理,并将结果返回给调用者。

然而,在我以两种风格实现它之后,我发现每种风格都有我最初并不清楚的限制。

  • 使用命令模式时,我可以通过使用新缓冲区开始接受更多输入数据,而早期的缓冲区正在由运行在单独工作线程中的一些命令处理。我似乎无法用装饰器模式做到这一点。
  • 使用装饰器模式时,装饰器可以对其委托进行任意数量的调用,并能够将结果组合成一个块。它还可以拆分数据,方法是发出一个大请求,缓存它,然后返回它的一部分。当我使用带有一个输入缓冲区和一个输出缓冲区的命令模式时,不能有任何组合或拆分结果。
4

1 回答 1

2

是否可以在任何线程上运行装饰器是实现定义的:)

如果你的装饰器是线程安全的......是的。如果没有:添加同步。这可能会破坏你的表现。

然而,在我看来,对于装饰者来说,大部分时间都花在他们正在装饰的对象上是很有意义的,除此之外只有一点点上下文/状态。这里被装饰的对象,显然首先应该是线程安全的(或感知的),否则即使没有装饰器也会有同样的问题。

也许这就是你所说的“轻量级”装饰器。如果您的装饰器是重量级的(因为他们“使用世界”来完成他们的工作),那么肯定需要同步。这甚至可能导致性能瓶颈。

但从根本上说 ,没有什么能阻止(通常)装饰器在您想要的任何线程上执行

于 2011-05-21T23:18:07.903 回答