自旋锁SPIN LOCK的编程实现

自旋锁是一种轻量级的互斥量,以达到对共享资源的保护。下面结合代码进行说明。

void

spin_enter(int* crt)

{

spin_try:

   __asm

    {

       mov eax, crt

       lock bts dword ptr [eax], 0   # 移动eax地址中的二进制的值的第0(由后面的操作                                                   #数指定该值)位到eflags的C标志位,然后第0位设                                                    #置为1

       jz spin_wait

    }

 

   return;

   

   __asm

    {

spin_wait:

       pause

       mov  eax, spin_var

       test eax, 1

       jne spin_wait

       jmp spin_try

    }

}

 

上面这段代码是关键。*crt初始值为0,lock bts dwordptr[eax], 0是将crt的第0位传递给ZF,同时将crt置为1。同时这条语句是被lock作为前缀的,即这条语句的执行无法并发。执行这条语句后,如果自旋锁此时是空闲的,那么ZF被置为0,反之,ZF被置为1。ZF被置为0时,直接return,否则jzspin_wait,进行wait操作,wait操作是监控crt的值,如果crt的值为1,说明自旋锁仍被占用,循环。否则说明自旋锁此时空闲,跳转到spin_try重新去获取资源。

     最后给出所有的代码,包括多线程的测试。

#include <stdio.h>

#include <windows.h>

#include <process.h>

#include <stddef.h>

#include <stdlib.h>

#include <conio.h>

 

 

int    spin_var = 0;

int    count = 0;

 

/*进入临界区*/

void

spin_enter(

   int*     crt

)

{

spin_try:

   __asm

    {

        mov eax, crt

       lock bts dword ptr [eax], 0

       jz spin_wait

    }

 

   return;

   

   __asm

    {

spin_wait:

       pause

       mov  eax, spin_var

       test eax, 1

       jne spin_wait

       jmp spin_try

    }

}

 

void

spin_leave(

    int*   crt         

)

{

   *crt = 0;

}

 

void thread_fun( void *ch)

{

  int  id = (int)ch;

 

  while (1)

   {

       spin_enter(&spin_var);

       printf("Thread %d : %d\n", id, count++);

 

       spin_leave(&spin_var);

   }

 

   _endthread();

}

 

 

void

main(void)

{

   int     thread_num = 10;

   int     i;

 

   for (i = 0; i < thread_num; i++)

    {

       _beginthread(thread_fun, 0, (void *) (i));

    }

 

   while (1)

    {

       Sleep(1000);

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值