TInterfacedObject._Release
和TInterfacedObject._AddRef
线程安全吗?
我可以看到 FRefCount
是线程安全的,但是 Destroy
不受锁或其他东西的保护。
function TInterfacedObject._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
不同线程同时执行
Destroy
是否会导致竞争条件?
TInterfacedObject
中引用计数方法的实现是线程安全的,因为引用计数是原子递增和递减的。
当
_Release
方法中对象实例的引用计数达到零时,这意味着不再有任何其他对该对象的强引用,并且销毁该对象将是线程安全的。
类似地,当你看
_AddRef
方法时,当你已经有一个对对象的强引用时,从中获取另一个强引用也将是线程安全的。
但是,这并不是故事的全部,在跨多个线程处理引用计数实例时还需要考虑其他事项。
引用分配不是线程安全的 - 如果不使用额外的访问保护机制(确保一次只有单个线程可以访问该引用(例如锁)),则无法以线程安全的方式拥有一个变量并从多个线程写入该变量.
从弱引用中获取强引用不是线程安全的 - 如果线程仅对某个引用计数实例具有弱引用,那么您无法以线程安全的方式将该弱引用分配给强引用