gpt4 book ai didi

windows - COM `IStream` 接口(interface)指针和来自不同线程的访问

转载 作者:可可西里 更新时间:2023-11-01 14:24:42 27 4
gpt4 key购买 nike

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

我不是在谈论数据完整性(通常,读/写/查找应该与锁同步)。问题是关于需要使用 COM 编码器将 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实现应遵循此

最佳答案

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

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

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

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

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

注意:线程模型属于对象而不是接口(interface)。一些支持 IStream 的对象可能是单线程的,其他的可能是完全线程安全的。这取决于实现接口(interface)的代码。因为接口(interface)只是一个规范,线程安全不在其中。

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

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

CoMarshalInterthreadInterfaceInStream 的情况下,您在文档中被告知返回的 IStream 接口(interface)可用于在目标线程上使用 CoUnmarshalInterfaceAndReleaseStream< 进行解码

也就是说,你得到了额外的保证。所以您可以信赖它的工作。

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

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

关于windows - COM `IStream` 接口(interface)指针和来自不同线程的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19902811/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com