gpt4 book ai didi

delphi - 混合原子操作与非原子操作

转载 作者:行者123 更新时间:2023-12-03 15:05:33 28 4
gpt4 key购买 nike

在delphi源代码中我们有:

class function TNetEncoding.GetBase64Encoding: TNetEncoding;
var
LEncoding: TBase64Encoding;
begin
if FBase64Encoding = nil then
begin
LEncoding := TBase64Encoding.Create;
if AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil then
LEncoding.Free
{$IFDEF AUTOREFCOUNT}
else
FBase64Encoding.__ObjAddRef
{$ENDIF AUTOREFCOUNT};
end;
Result := FBase64Encoding;
end;

但我不明白,他们将原子操作 (AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil)非原子操作混合在一起 就像 if FBase64Encoding = nil thenResult := FBase64Encoding;

这不是一个错误吗?

最佳答案

在评论中,您明确表示您担心不 protected 内存操作可能会被破坏。我们所说的撕裂是指读取线程在变量被部分写入时读取该变量。

一般来说,这是一个合理的担忧,但在这种情况下不会发生撕裂。原因是对齐的内存访问保证不会撕裂。当内存操作对齐时,就像这样,读取器无法读取部分写入的变量。这通常是由硬件总线在单个缓存行中串行化所有内存访问来保证的。

所以,不,这不是错误,代码是正确的。

代码本身用于延迟创建单例。以线程安全方式实现此目的的常用技术是双重检查锁定。此代码使用避免锁定的替代技术。相反,代码可能允许多个线程推测性地创建单例。如果多个线程成功创建该对象,则第一个成功的线程获胜,其他线程销毁其实例并使用获胜者线程创建的实例。

只要创建额外的实例然后销毁它们是良性的,无锁方法就可以很好地工作。但情况并非总是如此。例如,创建实例的多个副本可能过于昂贵。在这种情况下,基于锁的方法更好。

关于delphi - 混合原子操作与非原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54104882/

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