1. 原子访问:Interlocked系列函数——Interlocked系列函数会以原子方式来操控一个值。
// 传一个长整形变量的地址和另一个增量值,函数就会保证递增操作是以原子方式进行的。
LONG InterlockedExchangeAdd(PLONG volatile plAddend,LONG lIncrement);
LONGLONG InterlockedExchangeAdd64(PLONGLONG volatile pllAddend,LONGLONG llIncrement);
//InterlockedIncrement函数以原子方式给一个值加1。
LONG InterlockedIncrement(IN PLONG Addend);
//InterlockedExchange和InterlockedExchangePointer会把第一个参数所指向的内存地址的当前值,以原子方式替换为第二个参数指定的值。
LONG InterlockedExchange(OUT PLONG Target,IN LONG Value);
LONGLONG InterlockedExchange64(PLONGLONG volatile plTarget,LONGLONG lValue);
PVOID InterlockedExchangePointer(PVOID* volatile ppvTarget,PVOID pvValue);
//这两个函数都会返回原来的值。
// InterlockedCompareExchange和InterlockedCompareExchangePointer函数以原子方式执行一个测试和设置操作。
PVOID InterlockedCompareExchange(PLONG plDestination,LONG lExchange,LONG lComparand);
PVOID InterlockedCompareExchangePointer(PVOID* ppvDestination,PVOID pvExchange,PVOID pvComparand);
注意:我们必须确保传给这些函数的变量地址是经过对齐的,否则这些函数可能会失败。
C运行库提供了一个_aligned_malloc函数,我们可以使用这个函数来分配一块对齐过的内存:
void * _aligned_malloc(size_t size,size_t alignment);
// size表示要分配的字节数。
// alignment表示要对齐到的字节边界,传给alignment参数的值必须是2的整数幂次方 Interlocked单向链表函数——对Interlocked单向链表的栈进行操作,栈中的每个操作,比如入栈或出栈,必定是以原子方式进行的。 InitializeSListHead // 创建一个空栈
InterlockedPushEntrySList // 在栈顶添加一个元素
InterlockedPopEntrySList // 移除位于栈顶的元素并将它返回
InterlockedFlushSList // 清空栈
QueryDepthSList // 返回栈中元素的数量