您的位置:首页 > 其它

原子锁

2015-05-11 19:21 281 查看
【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周期左右)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  原子锁 多线程