AtomicExchange 支持 64 位参数吗?

3

AtomicExchange文档给出了该方法的签名:

function AtomicExchange(var Target; Value: <Integer or NativeInt or Pointer>): Integer; overload;
function AtomicExchange(var Target; Value: <Integer or NativeInt or Pointer>): Int64; overload;
function AtomicExchange(var Target; Value: <Integer or NativeInt or Pointer>): Pointer; overload;
function AtomicExchange(var Target; Value: <Integer or NativeInt or Pointer>): NativeInt; overload;

但实际上,Int64 似乎也是一个有效的参数,如下所示:

function AtomicExchange(var Target; Value: <Integer or Int64 or NativeInt or Pointer>): Integer; overload;
function AtomicExchange(var Target; Value: <Integer or Int64 or NativeInt or Pointer>): Int64; overload;
function AtomicExchange(var Target; Value: <Integer or Int64 or NativeInt or Pointer>): Pointer; overload;
function AtomicExchange(var Target; Value: <Integer or Int64 or NativeInt or Pointer>): NativeInt; overload;

注意: 除了文档之外,IDE 工具提示还建议 Int64 不是有效的参数:

enter image description here

实际上,我们可以使用一个 Int64 参数调用 AtomicExchange 吗?对于 32 位和 64 位目标,这能够正常工作吗?

1个回答

5

文档有误,AtomicExchange可用于64位操作数。许多内置函数的文档也有错误,这只是其中之一。

查看包含原子内置函数的TInterlocked类方法更加清晰。存在这个方法:

class function TInterlocked.Exchange(var Target: Int64; Value: Int64): Int64;
begin
  Result := AtomicExchange(Target, Value);
end;

这表明AtomicExchange完全支持64位值,即使在32位进程中也是如此。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接