【发布时间】:2021-10-28 17:52:18
【问题描述】:
根据Raymond's guide,在将 COM 接口编组到多个线程时,您必须“[t]将流的副本传输到要与之共享对象的每个线程。 " (或者您可以使用互斥体,但我们暂时先搁置该选项。)
我想知道使用IStream::Clone 是否足以达到此目的,或者这是否不算作副本。
另外,如果IStream::Clone 很好,我想知道您是否需要从创建原始流的线程中调用它,或者是否有一个后台线程可以调用它。我想知道,如果后台线程调用它,您是否会遇到我们一开始就试图避免的确切情况(跨线程共享 COM 指针)。
感谢您提供任何信息。
【问题讨论】:
-
不是从 Windows 8.1 开始,您只需要 RoGetAgileReference(在同一进程中)。
-
@SimonMourier 是的,我在 Windows 8.1 上尝试了
RoGetAgileReference,但收到了E_NOTIMPL。 -
@SimonMourier
RoGetAgileReference()可用于编组指向线程的接口指针。但它不会为该接口制作单独的副本以供多个线程使用。 -
什么意义将对象传递给多个线程?所以真的要多次通过同一个任务来池?几乎 100% 这是设计错误
-
@RbMm 那么为什么 Raymond 会提供如何操作的说明呢?为什么
MSHLFLAGS_TABLESTRONG存在?
标签: multithreading winapi com