【PS:欢迎砖头,如果本人理解上有问题欢迎指出】
和大家分享几个常用的(这些函数都还有其他版本的,这里就没有一一写了)
原子加,返回加操作之后的值
LONG __cdecl InterlockedAdd(
__in_out LONG volatile* Addend,
__in LONG Value
);
原子加,返回加操作之前的值
LONG __cdecl InterlockedExchangeAdd(
__in_out LONG volatile* Addend,
__in LONG Value
);
原子加一,返回加法之后的值
LONG __cdecl InterlockedIncrement(
__in_out LONG volatile* Addend
);
原子赋值
LONG __cdecl InterlockedExchange(
__in_out LONG volatile* Target,
__in LONG Value
);
指针
PVOID __cdecl InterlockedExchangePointer(
__in_out PVOID volatile* Target,
__in PVOID Value
);
比较交换
LONG __cdecl InterlockedCompareExchange(
__in_out LONG volatile* Destination,
__in LONG Exchange,
__in LONG Comparand
);
在多线程情况下这些函数就很有用了,他们可以保证所有的操作都是原子操作,并且还可以用这些函数组合一些不同的锁
比如说:
unsigned__stdcall Thread1Func(void *pArguments)
{
while (LOCKED_TRUE == InterlockedExchange(&lLockedFlag,LOCKED_TRUE))
{
Sleep(0);
}
_endthreadex(0);
return 0;
}
unsigned__stdcall Thread2Func(void *pArguments)
{
InterlockedExchange(&lLockedFlag, LOCKED_FALSE);
_endthreadex(0);
return 0;
}
这样就可以组合出一个旋转锁了,大家千万别小看那个Sleep(0),这条语句说明本线程放弃本周期内的CPU时间了,这样可以提升性能;这里也可以用SwitchToThread()替换Sleep(0);
这里注意下:Sleep(0)只是释放了本周期内的剩余时间,而SwitchToThread()会切换到其他线程,在线程优先级别不同的情况下用SwitchToThread()可以让优先级别低的线程更有可能得到CPU,
(这里有个前提:线程不会被锁住太久,这样的操作与切换到内核模式花费的代价来讲是很值得,切换模式大约需要1000个CPU周期,而一次Interlocked系类原子锁操作只需要5个CPU周期左右)