对于任何 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
实例。
所以你应该总是组织他们。