3

我想从 dll 传递堆分配的对象。显然,必须正确管理内存。有没有人看到我设计的以下狡猾方案有问题:

unbounded_buffer<shared_ptr<T>> buf;

我知道 shared_ptr 为包含的对象隐藏了一个删除器,因此在 dll 边界上单独使用它应该不是问题。

4

1 回答 1

1

以下是我从 MSFT 收到的关于该问题的信息:

  1. 是的,您可以在使用 CreateThread 手动创建的线程上使用消息块(如 unbounded_buffer)。

  2. 消息不能跨越 dll 边界,因为它的分配和删除必须发生在同一个 dll 中。一些消息块(如转换器)分配新消息。所以他们也面临同样的问题。unbounded_buffer> 非常好用,只是它不能解决上述问题。type 模板参数是指消息中的有效负载类型(即消息)。这不是信封的类型。

  3. 在稳定状态下,数据流网络的吞吐量非常好。性能损失的主要来源是在建立网络时消息块的链接和取消链接。在 Visual Studio 2010 中,send 和 asend 等消息启动命令会遭受这种性能损失。我们已经在即将发布的 Visual Studio 中解决了这个问题。没有计划将修复移植到 VS2010。一种潜在的解决方法是实现一个始终连接到数据流网络的简单 ISource 消息块。使用此块向网络发起消息(agents.h 中的 _Originator 是 ISource 块的示例)。

于 2012-06-27T16:21:07.407 回答