InterLockedIncrement不支持第二个参数?

时间:2015-10-26 17:07:02

标签: delphi

我想做

InterLockedIncrement(counter, step)

但是编译器说

参数太多

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

2 个答案:

答案 0 :(得分:7)

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

function InterlockedIncrement(var Addend: Integer): Integer; stdcall;
  

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

     

参数

     

加入[in,out]
  指向要递增的变量的指针。

根据您的要求,有一个InterlockedAdd()函数,但它在Delphi中不可用。您可以改为使用InterlockedExchangeAdd()功能:

function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer stdcall;
  

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

     

参数

     

加入[in,out]
  指向变量的指针。该变量的值将替换为操作的结果。

     

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

答案 1 :(得分:6)

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

还有TInterlocked.Add可满足您的需求。

但我认为最好的选择是内在函数AtomicIncrement。这样称呼:

AtomicIncrement(SomeVar, SomeAddend);

内在的优点是:

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