AtomicExchange для записей в Delphi - PullRequest
0 голосов
/ 24 августа 2018

Для AtomicExchange требуется переменная Integer или NativeInt.Итак, как мне установить значение записи в поточно-ориентированном виде?

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

  TStatusCode = record
  private
    FValue: Cardinal;
  public
    constructor Create(AValue: Cardinal);
    class operator Equal(Left, Right : TStatusCode): Boolean;
    class operator Implicit(Value: TStatusCode): Cardinal;
    class operator Implicit(Value: Cardinal): TStatusCode;
    class operator NotEqual(Left, Right : TStatusCode): Boolean;
    property Value: Cardinal read FValue;
  end;

1 Ответ

0 голосов
/ 24 августа 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...