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

对于任何 IStream实现来说,它是一个官方的COM要求,它应该是线程安全的,就通过线程中的相同接口指针并发访问IStream方法而言?

我不是在谈论数据完整性(通常,读/写/查找应该与锁同步)。 问题是需要使用COM编组器将IStream对象传递给来自不同COM IStream的线程。

这是一个比我询问的由CreateStreamOnHGlobal返回的IStream更为普遍的问题,请参阅更多技术细节。 我只是想更好地理解这个东西。

编辑 ,我已经在MSDN上find这个信息:

线程安全。 由SHCreateMemStream创build的stream在Windows 8之前是线程安全的。在较早的系统上,stream不是线程安全的。 由CreateStreamOnHGlobal创build的stream是线程安全的。

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

不,不是的。 对另一个问题的接受答案是错误的。 Hans Passant的答案是正确的。 你应该删除这个问题,因为它假设一个虚假的,即CreateStreamOnHGlobal返回一个线程安全的IStream。 它不。 然后你问这是否是其他的IStream实现。 事实并非如此。

在一般的计算机编程中,特别是COM中,对象有保证给予和保证他们不给。 如果您使用符合其保证的对象,则它将始终工作(禁止错误)。 如果超出保证范围,大部分时间可能仍然有效,但不再保证。

一般在COM中,线程安全保证是由一个标准线程模型给出的。

请参阅: http : //msdn.microsoft.com/en-us/library/ms809971.aspx

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

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

编组接口总是无害的。 如果线程的线程模型与对象的主线程兼容,则会返回完全相同的接口指针。 如果他们不兼容,你会得到一个代理。 但是它不会伤害元帅,除非你知道这些物体是兼容的,你应该总是元帅。

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

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

也就是说,你已经得到了额外的保证 。 所以你可以依靠那个工作。

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

所以你应该总是组织他们。