AtomicExchange用于Delphi中的记录

时间:2018-08-24 10:44:54

标签: delphi concurrency

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 :(得分:2)

如果您的记录大于8个字节,则原子操作没有硬件支持。否则,您可以使用强制转换来实现所需的功能。例如,在记录包含单个32位整数的情况下,您可以这样做:

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

请注意,记录必须对齐,因为该要求适用于基础AtomicExchange