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;
答案 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
。