原子访问
通过Interlocked系列函数是 Windows API 提供的一组原子操作函数,用于在多线程环境中安全地操作共享变量。当我们执行这些Interlocked系列函数的时候 ,函数会对总线发出一个硬件信号,这个硬件信号可以防止CPU同一时刻访问同一个内存地址,从而大打到原子访问的目的。以下是一些常用的 Interlocked 系列函数:
-
InterlockedIncrement:递增指定的变量。
-
InterlockedDecrement:递减指定的变量。
-
InterlockedExchange:将指定的变量设置为指定的值,并返回该变量的原值。
-
InterlockedExchangeAdd:将指定的值加到指定的变量上,并返回该变量的原值。
-
InterlockedCompareExchange:如果指定的变量的当前值等于指定的比较值,则将该变量设置为指定的值。
-
InterlockedAnd:对指定的变量执行按位与操作。
-
InterlockedOr:对指定的变量执行按位或操作。
-
InterlockedXor:对指定的变量执行按位异或操作。
LONG InterlockedIncrement(
Inout LONG volatile *Addend
);LONG InterlockedDecrement(
Inout LONG volatile *Addend
);LONG InterlockedExchange(
Inout LONG volatile *Target,
In LONG Value
);LONG InterlockedExchangeAdd(
Inout LONG volatile *Addend,
In LONG Value
);LONG InterlockedCompareExchange(
Inout LONG volatile *Destination,
In LONG Exchange,
In LONG Comperand
);LONG InterlockedAnd(
Inout LONG volatile *Destination,
In LONG Value
);LONG InterlockedOr(
Inout LONG volatile *Destination,
In LONG Value
);LONG InterlockedXor(
Inout LONG volatile *Destination,
In LONG Value
);
下面是一个简单的示例代码:
#include <iostream>
#include <Windows.h>
#include <process.h>
int main()
{
long value = 0;
InterlockedIncrement(&value);//变量值加1
std::cout << "Value: " << value << std::endl;//输出1
InterlockedDecrement(&value);//变量值减1
std::cout << "Value: " << value << std::endl;//输出0
InterlockedExchange(&value, 10);//将变量值设置为10
std::cout << "Value: " << value << std::endl;//输出10
InterlockedExchangeAdd(&value, 5);//将变量值加5
std::cout << "Value: " << value << std::endl;//输出15
InterlockedCompareExchange(&value, 20, 15);//如果变量值等于15,则将变量值设置为20
std::cout << "Value: " << value << std::endl;//输出20
return 0;
}