Ответ 1
InterlockedExchangeAdd()
"выполняет атомное добавление значения к значению, указанному Addend. Результат сохраняется в адресе, указанном Addend."
У блока System.SyncObjs
есть класс TInterlocked
, который перегружен Add()
сделать то же самое:
Приращение целочисленного значения с другим.
Есть два перегруженных метода
Add
. Оба методаAdd
увеличивают aTarget
на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()
"возвращает начальное значение переменной, на которую указывает Addend", тогда как TInterlocked.Add()
"возвращает значение параметра с приращением вместо этого. Итак, если вы используете возвращаемое значение, вам придется учитывать эту разницу, например:
function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer;
begin
Result := TInterlocked.Add(Addend, Value) - Value;
end;