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;
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. BothAdd
methods increment aTarget
byIncrement
.
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;