VS2010 的并发运行时和 unbounded_buffer<shared_ptr<T>>,有啥陷阱吗?
Posted
技术标签:
【中文标题】VS2010 的并发运行时和 unbounded_buffer<shared_ptr<T>>,有啥陷阱吗?【英文标题】: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 边界的异常可能是个问题。与您提到的内容无关,但是 - 邪恶的删除者可能会抛出。 【参考方案1】:这是我从 MSFT 收到的关于该问题的信息:
是的,您可以在使用 CreateThread 手动创建的线程上使用消息块(如 unbounded_buffer)。
消息不能跨越 dll 边界,因为它的分配和删除必须发生在同一个 dll 中。一些消息块(如转换器)分配新消息。所以他们也面临同样的问题。 unbounded_buffer> 非常好用,只是它不能解决上述问题。 type 模板参数是指消息中的有效负载类型(即消息)。这不是信封的类型。
在稳定状态下,数据流网络的吞吐量非常好。性能损失的主要来源是在建立网络时消息块的链接和取消链接。在 Visual Studio 2010 中,send 和 asend 等消息启动命令会遭受这种性能损失。我们已经在即将发布的 Visual Studio 中解决了这个问题。没有计划将修复移植到 VS2010。一个潜在的解决方法是实现一个始终连接到数据流网络的简单 ISource 消息块。使用此块向网络发起消息(agents.h 中的 _Originator 是 ISource 块的示例)。
【讨论】:
以上是关于VS2010 的并发运行时和 unbounded_buffer<shared_ptr<T>>,有啥陷阱吗?的主要内容,如果未能解决你的问题,请参考以下文章