Delphi 10.2(支持Linux)具有與Windows InterlocekdEchange等效的跨平臺功能AtomicExchange。到目前爲止這麼好...InterlockedExchangeAdd等於使用Delphi 10.2的Linux)
我必須使用InterlockedExchangeAdd端口的Win32代碼,它沒有AtomicExchangeAdd等價物。
我的問題是:在編譯Linux時,我可以用什麼來替換InterlockedExchangeAdd?
Delphi 10.2(支持Linux)具有與Windows InterlocekdEchange等效的跨平臺功能AtomicExchange。到目前爲止這麼好...InterlockedExchangeAdd等於使用Delphi 10.2的Linux)
我必須使用InterlockedExchangeAdd端口的Win32代碼,它沒有AtomicExchangeAdd等價物。
我的問題是:在編譯Linux時,我可以用什麼來替換InterlockedExchangeAdd?
InterlockedExchangeAdd()
「執行的原子加入值到值由加數指出,結果被存儲在由加數指定的地址。」
的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()
「返回初始值的變量的指向加數」,而TInterlocked.Add()
「返回遞增參數的值」代替。所以,如果你使用的返回值,你就必須考慮這種差異,如:
function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
Result := TInterlocked.Add(Addend, Value) - Value;
end;
這是真的互鎖(原子)?順便說一下,TInterlocked只是AtomicXYZ函數的一個包裝。 – fpiette
@fpiette是的,它是一個包裝器,但它也是一個用於原子操作的公共跨平臺接口。 –
'AtomicIncrement'等也是公共的跨平臺。你也可以選擇。 –
有一個在System.SysUtils.pas一個隱藏的實現這個功能:
function AtomicExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
Result := AtomicIncrement(Addend, Value) - Value;
end;
它利用的事實,AtomicIncrement返回加數的新價值,同時InterlockedExchangeAdd返回舊值。減去值給出了預期的結果,顯然是線程安全的。
http://stackoverflow.com/q/2287451/505088 –