元帅或不元帅
To Marshal or Not to Marshal
我找不到以下问题的明确答案:如果 COM class 是线程安全的,即它被标记为 Both 或 Free,我真的需要编组它的对象接口以通过它到同一进程中的另一个线程?我不问两个线程都属于 MTA 的情况,我问的是每个线程属于它自己的 STA 的情况。
我知道在属于不同单元的线程之间编组接口的规则,我的问题是如果我将原始接口指针传递给不同单元中的线程并且每个线程调用对象上的方法会发生什么线程安全?
根据我的经验,它运行良好,我的问题是,如果这只是时间问题,并且很危险并且可能由于任何原因导致崩溃,或者完全安全并且有规则就好了?
TL;DR - 始终编组...始终。
为什么?然后 COM 知道它并会做正确的事情...
... do I really need to marshal its object interface to pass it to another thread in the same process?
是的。总是。
这里的 COM 规则是,访问 COM 对象必须始终在创建它时所在的同一个单元中完成(对于 STA,在同一个线程上读取)。如果你颠覆它(即使它看起来有效) , 您可以 运行 进入 COM 调用之间的死锁,因为不同公寓中的对象会相互等待。
如果 COM 发现 marshal 的源和目标单元是 MTA,它不会强加任何开销。它还将能够根据需要管理对其他公寓的回调。
... if a COM class is thread safe, that is it is marked with Both or Free...
这意味着该对象可用于任何一种公寓类型。它在创建时决定了它要居住的公寓。
According to my experience it works fine, my question is if it is a matter of time, dangerous and leading to crash because of any reason, or it's completely safe and just nice to have rule?
颠覆 COM 线程模型通常会让人泪流满面 - 可能在最初的冒犯多年后安静下来。这是一颗定时炸弹。别这样。
如评论中所述,有 CoCreateFreeThreadedMarshaler
,但如链接文档中的评论中所述,它需要 "... 计算违反 COM 规则。 ..",并且确实暗示了非一般或狭窄的适用范围。
我找不到以下问题的明确答案:如果 COM class 是线程安全的,即它被标记为 Both 或 Free,我真的需要编组它的对象接口以通过它到同一进程中的另一个线程?我不问两个线程都属于 MTA 的情况,我问的是每个线程属于它自己的 STA 的情况。
我知道在属于不同单元的线程之间编组接口的规则,我的问题是如果我将原始接口指针传递给不同单元中的线程并且每个线程调用对象上的方法会发生什么线程安全?
根据我的经验,它运行良好,我的问题是,如果这只是时间问题,并且很危险并且可能由于任何原因导致崩溃,或者完全安全并且有规则就好了?
TL;DR - 始终编组...始终。
为什么?然后 COM 知道它并会做正确的事情...
... do I really need to marshal its object interface to pass it to another thread in the same process?
是的。总是。
这里的 COM 规则是,访问 COM 对象必须始终在创建它时所在的同一个单元中完成(对于 STA,在同一个线程上读取)。如果你颠覆它(即使它看起来有效) , 您可以 运行 进入 COM 调用之间的死锁,因为不同公寓中的对象会相互等待。
如果 COM 发现 marshal 的源和目标单元是 MTA,它不会强加任何开销。它还将能够根据需要管理对其他公寓的回调。
... if a COM class is thread safe, that is it is marked with Both or Free...
这意味着该对象可用于任何一种公寓类型。它在创建时决定了它要居住的公寓。
According to my experience it works fine, my question is if it is a matter of time, dangerous and leading to crash because of any reason, or it's completely safe and just nice to have rule?
颠覆 COM 线程模型通常会让人泪流满面 - 可能在最初的冒犯多年后安静下来。这是一颗定时炸弹。别这样。
如评论中所述,有 CoCreateFreeThreadedMarshaler
,但如链接文档中的评论中所述,它需要 "... 计算违反 COM 规则。 ..",并且确实暗示了非一般或狭窄的适用范围。