在使用 ATL 的自由线程进程内 COM 对象中,我想添加一个仅在 FinalConstruct()
中设置的成员变量。并且只在 FinalRelease()
中读取。没有其他代码会操作该成员变量。
我怀疑访问该成员变量时是否需要同步。我仔细阅读了 ATL 源代码,看起来这些方法总是被调用不超过一次,因此仅从一个线程调用。
这个假设正确吗?我可以省略同步吗?
最佳答案
是的,假设是正确的。将其视为 C++ 构造函数和析构函数的扩展。理论上,您可以在执行 FinalRelease()
时从不同的线程调用 COM 对象上的方法。虽然,这是未定义的行为,而不是预期的情况。您不应该尝试保护自己免受它的影响,就像您不会尝试保护自己免受析构函数中其他线程的影响一样。如果您必须在析构函数中保护自己,则设计通常会被破坏(这表明您的线程之间没有适当的终止协议(protocol))。
可以从另一个线程调用 FinalRelease()
的唯一方法是当客户端代码没有对您的对象的有效引用计数,或者代码的某些其他部分释放两次时。这是一个硬错误,并且可能最终会导致崩溃,与您可能遇到的任何同步错误完全无关。用于管理对象引用计数的 ATL 代码是线程安全的,并且不会留下任何竞争条件。
对于 FinalConstruct()
,在 FinalConstruct()
完成并成功返回代码之前,不会向任何客户端返回对该对象的引用。
关于visual-c++ - FinalConstruct()/FinalRelease() 内部是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6894644/