我想要做
InterLockedIncrement(counter, step)
Run Code Online (Sandbox Code Playgroud)
但编译说
参数太多了
是否有用于获取第二个参数的API?
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参数指向的变量的值.
您正在寻找的Windows功能已命名InterlockedAdd.但我不相信Delphi的RTL提供这个功能,可能是因为它实际上是作为MS工具链内在的编译器实现的.
还TInterlocked.Add可以满足您的需求.
但我认为最好的选择是内在功能AtomicIncrement.像这样称呼它:
AtomicIncrement(SomeVar, SomeAddend);
Run Code Online (Sandbox Code Playgroud)
内在的优点是: