You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中TInterfacedObject自动释放及_Release/_AddRef是否线程安全?

Delphi中TInterfacedObject的线程安全性分析

一、_AddRef与_Release方法的线程安全性

  • _AddRef和_Release对引用计数FRefCount的操作依赖原子指令(InterlockedIncrement/InterlockedDecrement),这部分是线程安全的。原子操作可以确保多个线程同时修改引用计数时,不会出现计数错误的竞态问题,引用计数的数值始终准确。

二、自动释放的线程安全性与Destroy调用的竞态问题

从你提供的_Release实现代码来看:

function TInterfacedObject._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;
  • 由于InterlockedDecrement是原子操作,只会有一个线程能得到Result = 0的返回值,因此Destroy方法只会被调用一次,不存在多个线程同时执行Destroy的竞态条件。

三、需要注意的额外场景

虽然引用计数的管理和Destroy的触发是线程安全的,但Destroy方法本身没有锁保护:

  • 如果在对象引用计数尚未减至0时,有其他线程在访问该对象的成员变量,而同时某个线程触发了Destroy,这时候会出现对象成员被释放后仍被访问的竞态问题。这种情况属于业务代码未正确同步对象访问导致的,并非TInterfacedObject引用计数机制本身的问题。

内容的提问来源于stack exchange,提问作者qgi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:42:34