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

问题描述 投票:0回答:1

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

function TInterfacedObject._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;

不同线程同时执行

Destroy
是否会导致竞争条件?

delphi thread-safety tinterfacedobject
1个回答
0
投票

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

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

类似地,当你看

_AddRef
方法时,当你已经有一个对对象的强引用时,从中获取另一个强引用也将是线程安全的。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.