gpt4 book ai didi

multithreading - 在Delphi中实现双重检查锁定是否可能或合理?

转载 作者:行者123 更新时间:2023-12-03 14:54:11 26 4
gpt4 key购买 nike

据我所知,保证延迟初始化线程安全的常见做法有两种:

  1. 双重检查锁定(将变量标记为 volatile 以避免内存排序)
  2. InterlockedCompareExchangePointer

看来VCL采用的是第二种做法。有什么理由吗?

class function TEncoding.GetUTF8: TEncoding;
var
LEncoding: TEncoding;
begin
if FUTF8Encoding = nil then
begin
LEncoding := TUTF8Encoding.Create;
if InterlockedCompareExchangePointer(Pointer(FUTF8Encoding), LEncoding, nil) <> nil then
LEncoding.Free;
end;
Result := FUTF8Encoding;
end;

或者有什么更好的方法吗?

谢谢!

最佳答案

速度差异应该不会太大。在这两种方法中,首先检查全局字段是否已初始化,并且仅在需要时才执行初始化。因此,大多数时候该函数只会进行比较、跳转、移动,而不进行任何初始化。

在执行初始化时,InterlockedCompareEtc 相对于锁定有两个优点。

  1. 速度更快。
  2. 代码更短(不需要初始化锁等)。

我发现 InterlockedCompareEtc 方法“更简洁”,并在我的代码中使用它。但锁定效果同样好。

关于multithreading - 在Delphi中实现双重检查锁定是否可能或合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com