0

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;
4

1 回答 1

2

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

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

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

于 2018-08-24T14:09:16.057 回答