【问题标题】:VS2010's concurency runtime and unbounded_buffer<shared_ptr<T>>, any pitfalls?VS2010 的并发运行时和 unbounded_buffer<shared_ptr<T>>,有什么陷阱吗?
【发布时间】:2012-06-08 15:15:27
【问题描述】:

我想从 dll 传递堆分配的对象。显然,memory must be managed correctly。有没有人发现我设计的以下狡猾方案有问题:

unbounded_buffer<shared_ptr<T>> buf;

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

【问题讨论】:

  • 跨 DLL 边界的异常可能是个问题。与您提到的内容无关,但是 - 邪恶的删除者可能会抛出。

标签: c++ visual-studio-2010 visual-c++ concurrency-runtime


【解决方案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 块的示例)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2011-12-13
    相关资源
    最近更新 更多