首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COM ` `IStream`‘接口指针和来自不同线程的访问

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

Stack Overflow用户
提问于 2013-11-11 09:24:53
回答 1查看 829关注 0票数 4

对于任何IStream实现来说,它应该是线程安全的,对于通过线程间相同的接口指针对IStream方法的并发访问来说,这是一个正式的COM要求吗?

我不是在讨论数据完整性(通常,读/写/查找应该与锁同步)。问题是需要使用COM封送处理程序将IStream对象从不同的COM单元传递给线程。

这是一个比我所问的关于CreateStreamOnHGlobal的更普遍的问题,请参考那里获得更多的技术细节。我只是想更好地理解这些东西。

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

螺纹安全。从Windows8开始,SHCreateMemStream创建的流是线程安全的.在早期的系统中,流不是线程安全的.由CreateStreamOnHGlobal创建的流是线程安全的.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-11 10:12:52

不,不是的。另一个问题的公认答案是完全错误的。汉斯·帕桑的回答是正确的。您应该删除这个问题,因为它以错误为前提,即CreateStreamOnHGlobal返回线程安全的IStream。然后,您会问其他IStream实现是否也是如此。事实并非如此。

在一般的计算机编程中,尤其是COM中,对象有它们提供的保证和它们不提供的保证。如果您使用的对象与它的保证一致,那么它将一直工作(排除bug)。如果您超过了保证,它可能仍然有效的大部分时间,但这不再是有保障的。

在COM中,线程安全保证一般采用标准的线程模型之一.

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

  • 单元线程对象可以在多个线程上实例化,但只能从它们被实例化的特定线程中使用。
  • 多线程公寓对象可以在多线程单元中实例化,并且可以从任何这些线程中使用。
  • “两个”-threaded对象都可以在任何线程中实例化,并且可以从任何线程中使用。

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

封送接口总是无害的。如果线程的线程模型与对象的主线程兼容,您将得到完全相同的接口指针。如果它们不兼容,您将得到一个代理。但是它不会伤害封送,并且除非您知道对象是兼容的,否则您应该始终封送。

然而,实现者总是可以提供额外的保证。

CoMarshalInterthreadInterfaceInStream的例子中,文档中告诉您返回的IStream接口可以使用CoUnmarshalInterfaceAndReleaseStream在目标线程上解组。

也就是说,你得到了额外的担保。所以你可以依靠这份工作。

但这在任何时候都不适用于IStream 的任何其他实例。

所以你应该一直管教他们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19902811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档