我有一个 COM 流对象(IStream http://msdn.microsoft.com/en-us/library/aa380034%28v=vs.85%29.aspx),创建于CreateStreamOnHGlobal http://msdn.microsoft.com/en-us/library/windows/desktop/aa378980%28v=vs.85%29.aspx.
我想在同一进程中的不同线程中使用它。我是否需要封送流对象本身(使用CoMarshalInterface
ETC)?或者它已经是线程安全的了?
EDITED,读/写/查找与我的代码中的锁正确同步。
COM 款待IStream
作为一种特殊类型的接口,可以安全地跨线程使用。这是必要的,以便其他接口可以在一个线程中跨线程边界进行编组。IStream
using CoMarshalInterThreadInterfaceInStream http://msdn.microsoft.com/en-us/library/windows/desktop/ms693316.aspx.
更多信息可以在 Dobb 博士 2003 年的一篇文章中找到:编组 COM 接口 http://www.drdobbs.com/marshaling-com-interfaces/184416838.
Update:
最初发布的答案并不完全正确。 OLE 提供的实现IStream
接口,由返回CreateStreamOnHGlobal http://msdn.microsoft.com/en-us/library/windows/desktop/aa378980.aspx并通过间接创建CoMarshalInterThreadInterfaceInStream http://msdn.microsoft.com/en-us/library/windows/desktop/ms693316.aspx可以在同一进程中跨线程安全地访问。
文档分散且难以获取。CoMarshalInterThreadInterfaceInStream
陈述如下:
当接收线程中运行的客户端尝试解组指针时,保证 ppStm 参数中返回的流能够正确运行。
类似的信息可用于CreateStreamOnHGlobal
from SHCreateMemStream http://msdn.microsoft.com/en-us/library/windows/desktop/bb773831.aspx:
CreateStreamOnHGlobal 创建的流是线程安全的。
这些保证通常并不适用于所有人IStream
实施。如果您想安全起见,您始终可以使用跨线程边界编组接口CoMarshalInterThreadInterfaceInStream
,即使不是绝对必要的。这是以这种方式编组接口指针永远不会有害,因为 COM 足够聪明,如果不需要编组,不会编组(或重新编组)指针 http://msdn.microsoft.com/en-us/magazine/cc302324.aspx。请记住,这是编组一次 - 解组一次。如果您想从多个线程中解组接口,您可以将接口放入全局接口表 http://msdn.microsoft.com/en-us/library/windows/desktop/ms693781.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)