我不是在讨论数据完整性(通常,读/写/搜索应该与锁同步).问题是需要使用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实现应该遵循这一点.
解决方法
一般而言,在计算机编程中,特别是COM,对象有保证他们给予并保证他们不给予.如果您使用符合其保证的对象,那么它将一直有效(除了错误).如果您超出保证范围,它可能仍会在大部分时间内工作,但不再保证.
通常在COM中,线程安全保证由一个标准线程模型给出.
见:http://msdn.microsoft.com/en-us/library/ms809971.aspx
>单元线程对象可以在多个线程上实例化,但只能从它们实例化的特定线程中使用.
>多线程单元对象可以在多线程单元中实例化,并且可以从任何这些线程中使用.
>“两个” – 线程对象可以在任何线程中实例化,并从任何线程使用.
注意:线程模型属于对象而不是接口.支持IStream的一些对象可以是单线程的,其他对象可以是完全线程安全的.这取决于实现接口的代码.因为接口只是一个规范,而线程安全不是它所涵盖的东西.
编组接口总是无害的.如果线程的线程模型与对象的主线程兼容,您将获得完全相同的接口指针.如果它们不兼容,您将获得代理.但它对编组从来没有伤害,除非你知道对象是兼容的,否则你应该总是编组.
但是,实施者始终可以提供额外的保证.
在CoMarshalInterthreadInterfaceInStream的情况下,在文档中告诉您,使用CoUnmarshalInterfaceAndReleaseStream可以将返回的IStream接口用于在目标线程上进行解组.
也就是说,您已获得额外保证.所以你可以依靠这种工作.
但这并不适用于任何其他任何IStream实例.
所以你应该总是把它们封为一体.