SpinLock原理和实现(SpinLock:test and set value in one instruction)

SpinLock 自旋锁。听起来非常地高深,专业啊!一把自己会旋转的锁。

其实没那么深奥的!

简单地说,获得Spinlock就是个判断全局变量,改全局变量的操作。(当然,实际还要处理time-out)

AcquireSpinLock

Do

nop

While lock==1

Lock=1

 

ReleaseSpinLock

Lock=0

 

当然,以上逻辑判断和赋值必须在一条指令完成,并且考虑SMP问题。

 

实现SpinLock 或者 ,Lock-Free算法时,需要具体的比较和交换操作(compare and swap - CAS)

 

//     逻辑如下.当然,要求比较和赋值在原子级别实现,否则SMP可能会有几个CPU错误地同时获得spinlock.这是我们要避免的. 这就是用lock cmpxchg8b的原因

bool TestAndSwap(int * memvalue,int TestValue,int NewValue)

{

       if(*memvalue == TestValue)

       {

              *memvalue = NewValue;

              return true;

}

else

{

       return false;

}

 

}

 

P5 指令 cmpxchg8b

cmpxchg8b m64

比较m64edx:eax组成的64bit

if m64=edx:eax

zf=1

ecx:ebx->m64

else

zf=0

m64->edx:eax

 

它有什么用?

 

bool TestAndSwapCmpxchg8b(_int64 * memvalue,_int64 TestValue,_int64 newvalue)

{

       _asm{

       mov eax,LODWORD(TestValue)

mov edx,HIDWORD(TestValue)

mov ebx,LODWORD(newvalue)

mov ecx,HIDWORD(newvalue)

lock cmpxchg8b qword ptr memvalue

jz equl

}

//     memtestvalue不等

return false;

equl:

return true;

 

 

}

 

AcquireSpinLock(lock * lck)

{

       do

{

       //       just null loop

}

while(!TestAndSwap(lck->value,0,1));

}

ReleaseSpinLock(lock * lck)

{

lck->value = 0;

}

 

类似的 x86还有其他指令也能实现test and set

比如 BTS m32,imm

测试位偏移处的值。如为1,CF->1

如不为1,CF->0且测试位被设置为1.这对实现Spinlock那是相当的方便啊!

事实上Win2K就是用的lock bts.

具体见Win2K source spininst.asm : KiInst_AcquireSpinLock函数实现

void demo_bset()

{

 

       long value = 0;

 

       _asm {

              lock bts value,0

              jc is_set

              jmp not_set

       }

 

is_set:

       printf("is set:%X/n",value);

       goto done;

not_set:

       printf("not set:%X/n",value);

       goto done;

done:

       return ;

 

}

 
总结:
spin lock - 一个指令能实现测试和设置,都可以来实现spinlock。如果是SMP,则要加上lock 前缀。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值