Delphi 10.2(支持Linux)具有跨平台函数AtomicExchange,它相当于Windows的InterlockedExchange。到目前为止还好...
我必须将使用InterlockedExchangeAdd的Win32代码移植,但没有AtomicExchangeAdd等效物。
我的问题是:在编译Linux时,我可以用什么来替换InterlockedExchangeAdd?
Delphi 10.2(支持Linux)具有跨平台函数AtomicExchange,它相当于Windows的InterlockedExchange。到目前为止还好...
我必须将使用InterlockedExchangeAdd的Win32代码移植,但没有AtomicExchangeAdd等效物。
我的问题是:在编译Linux时,我可以用什么来替换InterlockedExchangeAdd?
在System.SysUtils.pas中有一个隐藏的实现该函数的方法:
function AtomicExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
Result := AtomicIncrement(Addend, Value) - Value;
end;
它利用 AtomicIncrement 返回 Addend 的新值,而 InterlockedExchangeAdd 返回旧值的事实。减去 Value 可以得到预期结果并且显然是线程安全的。InterlockedExchangeAdd()
函数 "将Value原子地加到指向的Addend值中。结果存储在由Addend指定的地址中。"
System.SyncObjs
单元有一个TInterlocked
类,该类有重载的Add()
方法可以执行同样的操作:
增加整数值。
有两个重载的
Add
方法。这两个Add
方法都会将Increment
增加到Target
中。
class function Add(var Target: Integer; Increment: Integer): Integer; overload; static; inline;
class function Add(var Target: Int64; Increment: Int64): Int64; overload; static; inline;
InterlockedExchangeAdd()
“返回Addend指向的变量的初始值”,而TInterlocked.Add()
“返回增加后的参数的值”。因此,如果您使用返回值,您必须考虑到这种差异,例如:function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
Result := TInterlocked.Add(Addend, Value) - Value;
end;
AtomicIncrement
等也是公共跨平台的。您可以选择任何一个。 - David Heffernan