Linux 使用 Delphi 的 InterlockedExchangeAdd 等价物 10.2)

Equivalent of InterlockedExchangeAdd for Linux using Delphi 10.2)

Delphi 10.2(支持 Linux)有一个跨平台函数 AtomicExchange,相当于 Windows InterlokekdEchange。到目前为止一切顺利...

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

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

System.SysUtils.pas中有这个函数的隐藏实现:

function AtomicExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
  Result := AtomicIncrement(Addend, Value) - Value;
end;

它利用了 AtomicIncrement returns Addend 的新值,而 InterlockedExchangeAdd returns 旧值。减去 Value 给出了预期的结果,显然是线程安全的。

InterlockedExchangeAdd() "performs an atomic addition of Value to the value pointed to by Addend. The result is stored in the address specified by Addend."

System.SyncObjs 单元有一个 TInterlocked class, which has overloaded Add() 方法来做同样的事情:

Increments an integer value with another.

There are two overloaded Add methods. Both Add methods increment a Target by 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()"returns the initial value of the variable pointed to by Addend",而TInterlocked.Add()"returns the value of the incremented parameter"代替。因此,如果您使用 return 值,则必须考虑该差异,例如:

function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
  Result := TInterlocked.Add(Addend, Value) - Value;
end;