原子操作

获得互斥量以及其他锁原语的开销可能是非常大的。许多现代的计算机体系结构都会支持一些特殊的指令,这些指令使
开发人员可以快速执行普通的原子操作,而不会带来锁获取所导致的开销。微软提供了互锁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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值