元帅还是不元帅

To Marshal or Not to Marshal

本文关键字:      更新时间:2023-10-16

我找不到以下问题的确切答案:如果COM类是线程安全的,也就是说它被标记为Both或Free,我真的需要封送它的对象接口以将它传递给同一进程中的另一个线程吗?如果两个线程都属于MTA,我不会询问这种情况,而是询问每个线程属于自己的STA的情况。

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

根据我的经验,这很好,我的问题是,这是时间问题,而且很危险,可能会因为任何原因导致车祸,还是完全安全,有规则很好?

TL;DR-始终封送。。。总是

为什么?COM知道了这件事,就会做正确的事情。。。

我真的需要封送它的对象接口以将它传递给同一进程中的另一个线程吗?

是的。总是

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

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

如果COM类是线程安全的,也就是说,它被标记为Both或Free。。。

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

根据我的经验,这很好,我的问题是,这是时间问题,是危险的,会因为任何原因导致撞车,还是完全安全,有规则很好?

颠覆COM线程模型通常会让人泪流满面——可能是在最初的冒犯之后的几年里。这是一颗滴答作响的定时炸弹。不要这么做。


正如评论中所指出的,有CoCreateFreeThreadedMarshaler,但正如链接文档中的评论中所提到的,它要求"…蓄意违反COM规则…",并暗示了非通用或窄范围的适用性。

相关文章:
  • 没有找到相关文章