加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – COM`IStream`接口指针和来自不同线程的访问

发布时间:2020-12-14 05:42:36 所属栏目:Windows 来源:网络整理
导读:对于任何IStream实现的官方COM要求是什么,它应该是线程安全的,就通过跨线程的相同接口指针并发访问IStream方法而言? 我不是在讨论数据完整性(通常,读/写/搜索应该与锁同步).问题是需要使用COM marshaller将IStream对象传递给来自不同COM公寓的线程. 这是一
对于任何IStream实现的官方COM要求是什么,它应该是线程安全的,就通过跨线程的相同接口指针并发访问IStream方法而言?

我不是在讨论数据完整性(通常,读/写/搜索应该与锁同步).问题是需要使用COM marshaller将IStream对象传递给来自不同COM公寓的线程.

这是一个比我提到的关于IStream as returned by CreateStreamOnHGlobal更普遍的问题,请参考那里了解更多技术细节.我只是想更好地理解这些东西.

编辑,我在MSDN找到了这个信息:

Thread safety. The stream created by SHCreateMemStream is thread-safe
as of Windows 8. On earlier systems,the stream is not thread-safe.
The stream created by CreateStreamOnHGlobal is thread-safe.

现在我相信,CreateStreamOnHGlobal返回的IStream对象是线程安全的,但是没有要求其他IStream实现应该遵循这一点.

解决方法

不,不是.对另一个问题的公认答案是错误的. Hans Passant的回答是正确的.你应该删除这个问题,因为它预先假定了一个错误,即CreateStreamOnHGlobal返回一个线程安全的IStream.它没有.然后,您会问其他IStream实现是否属实.事实并非如此.

一般而言,在计算机编程中,特别是COM,对象有保证他们给予并保证他们不给予.如果您使用符合其保证的对象,那么它将一直有效(除了错误).如果您超出保证范围,它可能仍会在大部分时间内工作,但不再保证.

通常在COM中,线程安全保证由一个标准线程模型给出.

见:http://msdn.microsoft.com/en-us/library/ms809971.aspx

>单元线程对象可以在多个线程上实例化,但只能从它们实例化的特定线程中使用.
>多线程单元对象可以在多线程单元中实例化,并且可以从任何这些线程中使用.
>“两个” – 线程对象可以在任何线程中实例化,并从任何线程使用.

注意:线程模型属于对象而不是接口.支持IStream的一些对象可以是单线程的,其他对象可以是完全线程安全的.这取决于实现接口的代码.因为接口只是一个规范,而线程安全不是它所涵盖的东西.

编组接口总是无害的.如果线程的线程模型与对象的主线程兼容,您将获得完全相同的接口指针.如果它们不兼容,您将获得代理.但它对编组从来没有伤害,除非你知道对象是兼容的,否则你应该总是编组.

但是,实施者始终可以提供额外的保证.

在CoMarshalInterthreadInterfaceInStream的情况下,在文档中告诉您,使用CoUnmarshalInterfaceAndReleaseStream可以将返回的IStream接口用于在目标线程上进行解组.

也就是说,您已获得额外保证.所以你可以依靠这种工作.

但这并不适用于任何其他任何IStream实例.

所以你应该总是把它们封为一体.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读