AtomicExchange для записей в Delphi

TStatusCode = запись частного FValue : Cardinal ; публичный конструктор Create ( AValue : Cardinal ); оператор класса Equal ( Left , Right : TStatusCode ): Boolean ; оператор класса Implicit ( значение : TStatusCode ): кардинал ; оператор класса Неявный ( значение : кардинал ): TStatusCode ; оператор класса NotEqual ( Влево , Вправо : TStatusCode ): Boolean ; свойство Значение : кардинал читал FValue ; конец ; требуется переменная Integer или NativeInt. Итак, как мне установить значение записи в потокобезопасном режиме?

Соответствующая запись в принципе выглядит так (в действительности она имеет больше функций и свойств удобства):

function AtomicExchange(var Target: TStatusCode; Value: TStatusCode): TStatusCode; inline; overload;
begin
  Result := TStatusCode(System.AtomicExchange(PInteger(@Target)^, Integer(Value)));
end;

delphi,concurrency,

-1

Ответов: 1


1 принят

Если ваша запись больше 8 байтов, тогда нет аппаратной поддержки для атомных операций. В противном случае вы можете использовать броски для достижения желаемого. Например, в вашем случае, когда запись содержит одно 32-битное целое число, вы можете сделать так:

AtomicExchange

Обратите внимание, что запись должна быть выровнена, поскольку это требование относится к базовому AtomicExchange.

Дельфы, параллелизм,
Похожие вопросы