Delphi 中的 TInterfacedObject 自动释放线程安全吗?

qgi*_*qgi 3 delphi thread-safety tinterfacedobject

和线程安全吗TInterfacedObject._ReleaseTInterfacedObject._AddRef我可以看到FRefCount它是线程安全的,但Destroy不受锁或其他东西的保护。

function TInterfacedObject._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;
Run Code Online (Sandbox Code Playgroud)

不同的线程Destroy同时执行是否会导致竞争条件?

Dal*_*kar 5

引用计数方法的实现TInterfacedObject是线程安全的,因为引用计数以原子方式递增和递减。

当方法中对象实例的引用计数达到零时_Release,这意味着不再有任何其他对该对象的强引用,并且销毁该对象将是线程安全的。

类似地,当您查看_AddRef方法时,当您已经拥有对对象的强引用时,从中获取另一个强引用也将是线程安全的。

然而,这并不是故事的全部,在跨多个线程处理引用计数实例时还需要考虑其他事情。

  • 引用分配不是线程安全的 - 如果不使用额外的访问保护机制(如锁)确保一次只有单个线程可以访问该引用,则无法以线程安全的方式拥有一个变量并从多个线程写入该变量。

  • 从弱引用获取强引用不是线程安全的 - 如果线程仅对某个引用计数实例具有弱引用,那么您不能以线程安全的方式将该弱引用分配给强引用