我有一个IStream
用创建的COM流对象()CreateStreamOnHGlobal
。
我想在同一进程中的不同线程之间使用它。我是否需要封送流对象本身(使用CoMarshalInterface
etc)?还是已经是线程安全的?
EDITED,读/写/搜索已与我的代码中的锁正确同步。
COM被视为IStream
一种特殊的接口,可以在线程之间安全使用。这是必要的,以便可以在IStream
using中跨线程边界封送其他接口CoMarshalInterThreadInterfaceInStream
。
可以在Dobb博士的2003年文章:封送COM接口中找到更多信息。
更新:
最初发布的答案并不完全正确。由OLEIStream
返回的接口以及由OLECreateStreamOnHGlobal
间接创建的接口CoMarshalInterThreadInterfaceInStream
可以在同一过程中跨线程安全地访问。
文档分散且难以获取。CoMarshalInterThreadInterfaceInStream
陈述以下内容:
当在接收线程中运行的客户端尝试解组指针时,可以保证ppStm参数中返回的流的行为正确。
可CreateStreamOnHGlobal
从SHCreateMemStream
以下位置获得类似信息:
CreateStreamOnHGlobal创建的流是线程安全的。
这些保证通常并不适用于所有IStream
实现。为了安全起见CoMarshalInterThreadInterfaceInStream
,即使并非绝对必要,也可以始终使用跨线程边界封送接口。这是从来没有有害的这种方式来封送接口指针,因为COM是足够聪明,不元帅(或remarshal)的指针,如果封送处理是没有必要的。请记住,虽然这是一次元帅-一次元帅。如果要从多个线程解组接口,可以将接口放入“全局接口表”中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句