c++ - 编码(marshal)或不编码(marshal)

标签 c++ multithreading com marshalling apartments

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

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

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

最佳答案

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 规则...”,并且确实暗示了非一般或窄带适用性。

关于c++ - 编码(marshal)或不编码(marshal),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38454036/

相关文章:

c++17: 一个从未被销毁的临时对象

iphone - iPhone,后台线程无法正常工作

python - linux下Python的time.sleep(0)的行为——它会导致上下文切换吗?

c# - 从 DLL 在 C# 中调用 C++ 函数 - 奇怪的参数

delphi - Excel 类型库/Delphi 2009/错误的变量类型

c++ - 为什么这行得通? (多重继承,切片)

c++ - 未使用的变量警告与自动变量不同

c# - 可选地使用可能未注册的 COM 对象

具有可移动节点、可访问属性和可靠 ID 的 C++ 图形

python - 具有 Python 连接池的 Memcache 客户端?