原子访问
通过Interlocked系列函数是 Windows API 提供的一组原子操作函数,用于在多线程环境中安全地操作共享变量。当我们执行这些Interlocked系列函数的时候 ,函数会对总线发出一个硬件信号,这个硬件信号可以防止CPU同一时刻访问同一个内存地址,从而大打到原子访问的目的。以下是一些常用的 Interlocked 系列函数:
1. InterlockedIncrement:递增指定的变量。
2. InterlockedDecrement:递减指定的变量。
3. InterlockedExchange:将指定的变量设置为指定的值,并返回该变量的原值。
4. InterlockedExchangeAdd:将指定的值加到指定的变量上,并返回该变量的原值。
5. InterlockedCompareExchange:如果指定的变量的当前值等于指定的比较值,则将该变量设置为指定的值。
6. InterlockedAnd:对指定的变量执行按位与操作。
7. InterlockedOr:对指定的变量执行按位或操作。
8. 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;
}