Delphi 10.2(支持Linux)具有跨平台功能AtomicExchange,相当于Windows InterlocekdEchange。到目前为止一切都很好......
我必须使用没有AtomicExchangeAdd等效的InterlockedExchangeAdd来移植Win32代码。
我的问题是:在为Linux编译时,我可以用什么来替换InterlockedExchangeAdd?
答案 0 :(得分:11)
System.SysUtils.pas 中有一个隐藏的此功能实现:
function AtomicExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
Result := AtomicIncrement(Addend, Value) - Value;
end;
它利用 AtomicIncrement 返回 Addend 的新值这一事实,而 InterlockedExchangeAdd 返回旧值。减去 Value 会得到预期的结果,显然是线程安全的。
答案 1 :(得分:10)
InterlockedExchangeAdd()
“对 Addend 指向的值执行 Value 的原子添加。结果存储在 Addend指定的地址中“。
System.SyncObjs
单元有一个TInterlocked
类,它有重载Add()
方法来执行相同的操作:
使用另一个增加整数值。
有两种重载的
Add
方法。Add
两种方法都将Target
增加Increment
。
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;