【问题标题】:Is there any way to enforce synchronous destruction within the execution thread for a COM pointer object?有没有办法在 COM 指针对象的执行线程中强制同步销毁?
【发布时间】:2020-07-29 15:04:28
【问题描述】:

我知道,当您创建和释放 CComPtr 类时,引用会增加和减少。当引用变为 0 时,智能 COM 指针被破坏。

我不太确定 COM 在并发方面是如何工作的。如果我重置/释放持有最后一个引用的 CComPtr,我是否有办法完全保证在下一个位置析构函数已完全执行?

我想知道减少引用和调用析构函数是否会发生在我正在重置最后一个 com 指针的同一线程中。我听说它通常是某种 COM 线程,它实际上会处理这个问题。如果是这种情况,有没有办法将 COM 销毁与您的主工作线程同步?

【问题讨论】:

  • “当引用变为 0 时,智能 COM 指针被破坏。” 不准确。 ATL::CComPtr 是一个包装器,用于管理对 AddRef(分配时)、Release(重置、分配和超出范围)和接口成员访问的调用。它实际上并没有“破坏”任何东西。如果 Release 调用(通过重置或销毁)将对象引用计数发送到零,则对象 自毁。所有这些调用(对 AddRef、Release 等)都发生在与您正在使用的 公寓模型 匹配的线程上的对象端。
  • 作为 COM 对象的客户端,这不应该是您的问题,这就是 COM 线程模型的目的:处理并发。好吧,如果每个人都按照它所说的方式行事。不要混淆智能指针(CComPtr,它是一种可选的编程工具)和 COM 本身。
  • 您的 CComPtr 是 COM 对象的客户端。如果客户端行为正常,COM 对象将正确管理自己的“生命”。如果 COM 对象被多个客户端使用,并且它们都与 COM 对象正确连接和断开连接(正确的 AddRef 和 Release),则 COM 对象将正确实例化和销毁自己,而无需客户端(您)关心关于它。如果您关心的是强制 COM 对象保持活动状态,则必须附加一个客户端并通过保持客户端活动来保持其打开。

标签: c++ multithreading concurrency com


【解决方案1】:

由于设置智能指针为nullptr间接调用IUnknown::Release(),只是另外一个函数调用,所以取决于当前的模型(见CoInitializeEx())。

如果是 MTA,释放发生在你调用它的线程中。如果是 STA,则释放是序列化的。 STA的重点是避免手动同步。

更多关于 COM 公寓here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多