原子锁

【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周期左右)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值