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