获得互斥量以及其他锁原语的开销可能是非常大的。许多现代的计算机体系结构都会支持一些特殊的指令,这些指令使
开发人员可以快速执行普通的原子操作,而不会带来锁获取所导致的开销。微软提供了互锁API来支持这些操作。
互锁函数提供了32位和64位变量的原子操作。这些函数主要进行下列操作:
InterlockedIncrement()完成一个原子操作,将递增一个32位变量。该函数的64位版本是InterlockedIncrement64()。
InterlockedDecrement()完成一个原子操作,递减一个32位变量。该函数的64位版本是InterlockedDecrement64()。
InterlockedExchange()完成一个原子操作,将一个32位的值赋给另一个目标变量。该函数的64位版本是
InterlockedExchange64()。若需要交换指针,可以使用InterlockedExchangePointer()函数。
LONG InterlockedExchange( LPLONG Target, LONG Value );
PVOID InterlockedExchangePointer( PVOID *Target, PVOID Value );
InterlockedExchangeAdd()完成一个原子操作,相当于C语言中的+=操作。该函数把32位目标变量与一个给定的值相
加,并将二者的和赋给该目标变量。该函数的64位版本是InterlockedExchangeAdd64()。
LONG InterlockedExchangeAdd ( LPLONG Addend, LONG Increment );
InterlockedCompareExchange()完成一个原子操作,将比较数(Comperand)与目标值比较,若结果为真,则更新目
标值。该函数有三个参数:指向目标(Destination)变量的指针,一个32位交换值(即Exchange,该值在比较成功
后,将替换目标值)以及一个用于和目标值进行比较的比较数(Comperand)。若Destination等于Compareand,则
将Exchange的值赋给Destination。若比较失败,则该函数不做任何操作。该函数的64位版本是
InterlockedCompareExchange64()。若需要交换指针,则使用InterlockedCompareExchangePointer()。
LONG InterlockedCompareExchange(
LPLONG Destination,
LONG Exchange,
LONG Comperand );
除了提供对变量的原子访问外,互锁函数还提供了对单链表进行原子访问的支持。下面给出的四个函数就属于这类操作:
InitializeSListHead()用来初始化链表。
void WINAPI InitializeSListHead( __inout PSLIST_HEADER ListHead);
InterlockedPushEntrySList()完成一个原子操作,即在链表头部加入一个节点。
PSLIST_ENTRY WINAPI InterlockedPushEntrySList(
__inout PSLIST_HEADER ListHead,
__inout PSLIST_ENTRY ListEntry
);
InterlockedPopEntrySList()完成一个原子操作,即从链表尾部删除一个节点。
PSLIST_ENTRY WINAPI InterlockedPopEntrySList( __inout PSLIST_HEADER ListHead);
InterlockedFlushSList()完成一个原子操作,即清除链表中的所有节点。
PSLIST_ENTRY WINAPI InterlockedFlushSList( __inout PSLIST_HEADER ListHead);