1

我找不到以下问题的明确答案:如果一个 COM 类是线程安全的,即它被标记为 Both 或 Free,我真的需要编组它的对象接口以将其传递给同一进程中的另一个线程吗?我不问两个线程是否都属于 MTA 的情况,我问的是每个线程都属于它自己的 STA 的情况。

我知道在属于不同单元的线程之间编组接口的规则,我的问题是如果我将原始接口指针传递给不同单元中的线程并且每个线程调用线程安全的对象上的方法会发生什么?

根据我的经验,它运行良好,我的问题是,如果这是一个时间问题,并且很危险并且可能由于任何原因导致崩溃,还是完全安全并且有规则很好?

4

1 回答 1

2

TL;DR - 总是元帅......总是。

为什么?然后 COM 知道这件事并会做正确的事......

...我真的需要编组其对象接口以将其传递给同一进程中的另一个线程吗?

是的。总是。

这里的 COM 规则是,访问 COM 对象必须始终在创建它时在同一个单元中完成(对于 STA,在同一个线程上读取)。如果你颠覆它(即使它看起来有效),你可能会遇到COM 调用之间出现死锁,因为不同公寓中的对象相互等待。

如果 COM 看到元帅的源和目标公寓是 MTA,它不会强加任何开销。它还将能够根据需要管理对其他公寓的回调。

...如果一个 COM 类是线程安全的,那就是它被标记为 Both 或 Free...

这意味着该对象可以用于任何一种公寓类型。正是在创造的时候,决定了它将居住的公寓。

根据我的经验,它运行良好,我的问题是,这是否只是时间问题、危险并因任何原因导致崩溃,还是完全安全且拥有规则很好?

颠覆 COM 线程模型通常会让人泪流满面——可能在最初的罪行发生数年后才平静下来。这是一颗定时炸弹。不要这样做。


如评论中所述,有CoCreateFreeThreadedMarshaler,但如链接文档中的评论所述,它需要“......计算出违反 COM 规则......”,并且确实暗示了非一般或窄带的适用性。

于 2016-07-19T09:20:14.930 回答