我有一个COM流对象(IStream
),它是用CreateStreamOnHGlobal
创建的。
我想在同一个进程中跨不同的线程使用它。我是否需要封送流对象本身(使用CoMarshalInterface
等)?还是线程已经安全了?
编辑的、读/写/查找与我的代码中的锁正确同步。
发布于 2013-11-10 22:23:07
COM将IStream
视为一种特殊类型的接口,可以安全地跨线程使用。这是必要的,这样就可以使用IStream
使用CoMarshalInterThreadInterfaceInStream
跨线程边界封送其他接口。
更多的信息可以在2003年博士的一篇文章中找到:封送COM接口。
更新:
最初发布的答案并不完全正确。IStream
接口的OLE提供的实现(由CreateStreamOnHGlobal
返回并通过CoMarshalInterThreadInterfaceInStream
间接创建)可以在同一进程中通过线程安全地访问。
文档是分散的,很难获得。CoMarshalInterThreadInterfaceInStream
声明如下:
当在接收线程中运行的客户端试图解组指针时,ppStm参数中返回的流可以保证行为正确。
CreateStreamOnHGlobal
可以从SHCreateMemStream
获得类似的信息。
CreateStreamOnHGlobal创建的流是线程安全的。
对于所有IStream
实现来说,这些保证通常都是不成立的。如果您想安全地使用它,您可以始终使用CoMarshalInterThreadInterfaceInStream
跨线程边界封送接口,即使不是严格必要的。是以这种方式封送接口指针是没有害处的,因为如果没有必要进行封送,COM就不会对指针进行封送(或重新发送)。。请记住,这是元帅一次-解封一次。如果您想从多个线程解封接口,可以将接口放置到全局接口表中。
https://stackoverflow.com/questions/19895635
复制相似问题