Visual c++ FinalConstruct()/FinalRelease()中是否需要同步?

Visual c++ FinalConstruct()/FinalRelease()中是否需要同步?,visual-c++,com,concurrency,synchronization,atl,Visual C++,Com,Concurrency,Synchronization,Atl,在使用ATL的自由线程In-proc COM对象中,我想添加一个成员变量,该变量将仅在FinalRelease()中设置,并在FinalRelease()中只读。没有其他代码会操作该成员变量 我怀疑访问该成员变量时是否需要同步。我仔细阅读了ATL源代码,看起来这些方法总是被调用不超过一次,因此只能从一个线程调用 这是正确的假设吗?我可以省略同步吗?是的,假设是正确的。把它看作C++构造函数和析构函数的扩展。理论上,当执行FinalRelease()时,可以从不同的线程调用COM对象上的方法。尽管

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

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


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

是的,假设是正确的。把它看作C++构造函数和析构函数的扩展。理论上,当执行
FinalRelease()
时,可以从不同的线程调用COM对象上的方法。尽管如此,这是未定义的行为,并非预期的事件。您不应该试图保护自己不受它的影响,就像您不应该试图保护自己不受析构函数中其他线程的影响一样。如果必须在析构函数中保护自己,那么设计通常会被破坏(这表明线程之间没有合适的终止协议)

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

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