2017-04-22 52 views
11

Delphi 10.2(支持Linux)具有與Windows InterlocekdEchange等效的跨平臺功能AtomicExchange。到目前爲止這麼好...InterlockedExchangeAdd等於使用Delphi 10.2的Linux)

我必須使用InterlockedExchangeAdd端口的Win32代碼,它沒有AtomicExchangeAdd等價物。

我的問題是:在編譯Linux時,我可以用什麼來替換InterlockedExchangeAdd?

+0

http://stackoverflow.com/q/2287451/505088 –

回答

10

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; 
+0

這是真的互鎖(原子)?順便說一下,TInterlocked只是AtomicXYZ函數的一個包裝。 – fpiette

+0

@fpiette是的,它是一個包裝器,但它也是一個用於原子操作的公共跨平臺接口。 –

+1

'AtomicIncrement'等也是公共的跨平臺。你也可以選擇。 –

11

有一個在System.SysUtils.pas一個隱藏的實現這個功能:

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

它利用的事實,AtomicIncrement返回加數的新價值,同時InterlockedExchangeAdd返回舊值。減去給出了預期的結果,顯然是線程安全的。