COM接口多线程封送时使用IStream::Clone是否足够还是需拷贝流?
首先明确COM跨线程封送的基础规则:
向多个线程封送COM接口时,你必须向每个你希望共享对象的线程传输流的副本。
IStream::Clone 是否符合流副本的要求
该规则的核心目的有两个:一是避免跨线程直接共享原始COM接口指针,二是保证每个线程读取封送流时不会互相干扰。
对于CoMarshalInterface生成的、用于COM接口封送的IStream来说,IStream::Clone完全满足要求:它会生成一个独立的IStream实例,克隆后的流和原始流的读取指针完全独立,你可以把每个克隆得到的实例单独传给不同线程调用CoUnmarshalInterface,不会出现多线程争抢流指针导致的封送异常。
Clone方法的调用线程限制
IStream::Clone本身是COM接口的成员方法,必须严格遵循COM公寓的线程调用规则:不允许跨线程公寓直接调用原始IStream指针的任何方法,包括Clone。
因此你必须在创建原始流的线程上下文中调用IStream::Clone生成所有需要的副本,再把每个副本分别传递给对应目标线程使用。如果你把原始流指针直接传到后台线程再执行Clone操作,本质就是跨线程共享原始COM指针,刚好会触发你想要避免的线程安全问题。
内容的提问来源于stack exchange,提问作者user15284017
相关产品推荐
相关产品推荐

