visual-c++ - FinalConstruct()/FinalRelease() 内部是否需要同步?

标签 visual-c++ com concurrency synchronization atl

在使用 ATL 的自由线程进程内 COM 对象中,我想添加一个仅在 FinalConstruct() 中设置的成员变量。并且只在 FinalRelease() 中读取。没有其他代码会操作该成员变量。

我怀疑访问该成员变量时是否需要同步。我仔细阅读了 ATL 源代码,看起来这些方法总是被调用不超过一次,因此仅从一个线程调用。

这个假设正确吗?我可以省略同步吗?

最佳答案

是的,假设是正确的。将其视为 C++ 构造函数和析构函数的扩展。理论上,您可以在执行 FinalRelease() 时从不同的线程调用 COM 对象上的方法。虽然,这是未定义的行为,而不是预期的情况。您不应该尝试保护自己免受它的影响,就像您不会尝试保护自己免受析构函数中其他线程的影响一样。如果您必须在析构函数中保护自己,则设计通常会被破坏(这表明您的线程之间没有适当的终止协议(protocol))。

可以从另一个线程调用 FinalRelease() 的唯一方法是当客户端代码没有对您的对象的有效引用计数,或者代码的某些其他部分释放两次时。这是一个硬错误,并且可能最终会导致崩溃,与您可能遇到的任何同步错误完全无关。用于管理对象引用计数的 ATL 代码是线程安全的,并且不会留下任何竞争条件。

对于 FinalConstruct(),在 FinalConstruct() 完成并成功返回代码之前,不会向任何客户端返回对该对象的引用。

关于visual-c++ - FinalConstruct()/FinalRelease() 内部是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6894644/

相关文章:

c++ - 二叉搜索树未处理的异常

c# - 释放临时 COM 对象

c++ - IID_IDropTarget 和 Virtualtrees::IID_IDropTarget 之间的歧义

Java 并发规范 ? : Is an update to a field inside a synchronized block visible to all threads?

java - ReentrantLock 替代 CountdownLatch

java - 为什么 AtomicReference CAS 返回值为 128 的 false?

c - C 是否允许将结构类型转换为自身?

C++ 在编译时创建 BSTR/在编译时将长度插入字符串?

将 OPC-UA-AnsiC 编译为 DLL

C# Outlook 2007 COM 互操作应用程序不退出!