InterLockedIncrement不支持第二个参数?

jus*_*tyy 3 delphi

我想要做

InterLockedIncrement(counter, step)
Run Code Online (Sandbox Code Playgroud)

但编译说

参数太多了

是否有用于获取第二个参数的API?

Rem*_*eau 7

InterlockedIncrement() 只有一个参数 - 要增加1的变量:

function InterlockedIncrement(var Addend: Integer): Integer; stdcall;
Run Code Online (Sandbox Code Playgroud)

将指定的32位变量的值递增(增加1)作为原子操作.

参数

Addend [in,out]
指向要递增的变量的指针.

对于您的要求,有一个InterlockedAdd()功能,但它在Delphi中不可用.您可以使用该InterlockedExchangeAdd()功能:

function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer stdcall;
Run Code Online (Sandbox Code Playgroud)

执行两个32位值的原子添加.

参数

Addend [in,out]
指向变量的指针.此变量的值将替换为操作的结果.

Value [in]
要添加到Addend参数指向的变量的值.

  • @DoctorLai:`InterlockedExchangeAdd()`返回"*Addend参数的初始值*",而`InterlockedAdd()`返回"*操作*的结果".此外,"*InterlockedAdd功能仅适用于Itanium平台.在x86和x86-64平台上,您可以使用InterlockedExchangeAdd.*" (3认同)

Dav*_*nan 6

您正在寻找的Windows功能已命名InterlockedAdd.但我不相信Delphi的RTL提供这个功能,可能是因为它实际上是作为MS工具链内在的编译器实现的.

TInterlocked.Add可以满足您的需求.

但我认为最好的选择是内在功能AtomicIncrement.像这样称呼它:

AtomicIncrement(SomeVar, SomeAddend);
Run Code Online (Sandbox Code Playgroud)

内在的优点是:

  1. 它是跨平台的.
  2. 它是内联的,因此避免了函数调用的成本.

  • 请注意,"TInterlocked"仅在XE +中可用,而"AtomicIncrement()"仅在XE3 +中可用. (2认同)