InterlockedExchangeAdd()
« effectue une addition atomique de Valeur à la valeur pointée par Cumulande. Le résultat est stocké dans l'adresse spécifiée par Cumulande. »
L'unité System.SyncObjs
a une classe TInterlocked
, qui a surchargé Add()
méthodes pour faire la même chose:
incrémente un nombre entier avec une autre. Il existe deux méthodes Add
surchargées. Les deux méthodes Add
incrémentent un Target
par 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;
La différence est que InterlockedExchangeAdd()
« retourne la valeur initiale de la variable pointée par Cumulande », alors que TInterlocked.Add()
« retourne la valeur du paramètre incrémenté » à la place. Donc, si vous utilisez la valeur de retour, vous devrez tenir compte de cette différence, par exemple:
function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
Result := TInterlocked.Add(Addend, Value) - Value;
end;
http://stackoverflow.com/q/2287451/505088 –