要元帅还是不要元帅

时间:2016-07-19 09:06:08

标签: c++ multithreading com marshalling apartments

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

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

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

1 个答案:

答案 0 :(得分:2)

TL; DR - 总是编组......永远。

为什么呢?然后COM知道它,并会做正确的事......

  

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

是。总是

这里的COM规则是访问COM对象必须始终在同一个公寓(在STA的同一个线程上读取)中创建。如果你颠覆它(即使它似乎工作),你可能会在COM调用之间遇到死锁,因为单独公寓中的对象会相互等待。

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

  

...如果COM类是线程安全的,那就是用Both或Free标记......

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

  

根据我的经验,它运作良好,我的问题是,这是一个时间问题,危险并导致因任何原因导致崩溃,或者它是完全安全的,并且很高兴有规则?

颠覆COM线程模型通常会在最初的攻击后数年内安静下来。这是一颗滴答作响的定时炸弹。不要这样做。

如评论中所述,有CoCreateFreeThreadedMarshaler,但正如链接文档中的评论所述,它需要" ...计算违反COM规则。 。" ,并暗示了非一般或狭窄的适用范围。