使用Delphi 10.2等效的InterlockedExchangeAdd for Linux

时间:2017-04-22 16:29:16

标签: linux delphi atomicity

Delphi 10.2(支持Linux)具有跨平台功能AtomicExchange,相当于Windows InterlocekdEchange。到目前为止一切都很好......

我必须使用没有AtomicExchangeAdd等效的InterlockedExchangeAdd来移植Win32代码。

我的问题是:在为Linux编译时,我可以用什么来替换InterlockedExchangeAdd?

2 个答案:

答案 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;