windows 自旋锁的实现

VOID
KxAcquireSpinLock ( __inout PKSPIN_LOCK SpinLock)
{
        //设置SpinLock指定位,并返回原值
        //如果原值为0,表示没有上锁,直接返回
        //如果原值为1,表示已经上锁,进入函数
    if (InterlockedBitTestAndSet64((LONG64 *)SpinLock, 0))
    {
        
        KxWaitForSpinLockAndAcquire(SpinLock);
    }

    return;
}

DECLSPEC_NOINLINE
ULONG64
KxWaitForSpinLockAndAcquire (__inout PKSPIN_LOCK SpinLock)
{
    do {
        do {
            KeYieldProcessor();
        } while (*(volatile LONG64 *)SpinLock != 0);//当锁被占用时,循环,内存循环

    //锁被释放.再次置位并探测原值, 不一定刚好是当前线程获得了        
    } while(InterlockedBitTestAndSet64((LONG64 *)SpinLock, 0));//返回原值为1时,继续循环

}

汇编实现:


lock bts qword ptr [rcx], 0        ;判断原值
jnb     short RETURN                ; jump short if not below (CF=0)

WAIT:
        pause;
        mov     rax, [rcx]
        test    rax, rax
        jnz    wait                     ;为1,继续停机等待
        lock bts qword ptr [rcx], 0    ;
        jb      short WAIT             ;CF为1,跳转,说明原值为1,表示并没有获取到锁,继续停机

RETURN:
        ret;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值