4

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

我不是在谈论数据完整性(通常,无论如何,读/写/搜索都应该与锁同步)。问题是需要使用 COM 编组器将IStream对象从不同的 COM 单元传递给线程。

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

已编辑,我在MSDN上找到了此信息:

线程安全。从 Windows 8 开始,由 SHCreateMemStream 创建的流是线程安全的。在早期系统上,流不是线程安全的。 CreateStreamOnHGlobal 创建的流是线程安全的。

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

4

1 回答 1

1

不,不是。另一个问题的公认答案是完全错误的。Hans Passant 的回答是正确的。您应该删除这个问题,因为它预设了一个错误,即 CreateStreamOnHGlobal 返回一个线程安全的 IStream。它没有。然后您询问其他 IStream 实现是否也是如此。它不是。

在一般的计算机编程中,特别是在 COM 中,对象有它们给出的保证和不给出的保证。如果您使用符合其保证的对象,那么它将一直工作(除非出现错误)。如果您超出保证,它可能在大部分时间仍然有效,但这不再得到保证。

通常在 COM 中,线程安全保证由标准线程模型之一提供。

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

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

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

编组接口总是无害的。如果线程的线程模型与对象的主线程兼容,您将得到完全相同的接口指针。如果它们不兼容,您将获得代理。但是编组永远不会有坏处,除非您知道对象是兼容的,否则您应该始终进行编组。

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

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

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

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

因此,您应该始终对它们进行编组。

于 2013-11-11T10:12:52.570 回答