lesson3

来源:互联网 发布:大连网店美工招聘 编辑:程序博客网 时间:2024/04/29 04:05

自旋锁还是不理解

  1. static inlinevoid __raw_spin_lock(raw_spinlock_t *lock) 
  1.     asm volatile("\n1:\t" 
  1.              LOCK_PREFIX " ; decb %0\n\t" 
  1.              "jns 3f\n" 
  1.              "2:\t" 
  1.              "rep;nop\n\t" 
  1.              "cmpb $0,%0\n\t" 
  1.              "jle 2b\n\t" 
  1.              "jmp 1b\n" 
  1.              "3:\n\t" 
  1.              : "+m" (lock->slock) : :"memory"); 

line  4: 对lock->slock自减,这个操作是互斥的,LOCK_PREFIX保证了此刻只能有一个CPU访问内存
line  5: 判断lock->slock是否为非负数,如果是跳转到3,即获得自旋锁
line  6: 位置符
line  7: lock->slock此时为负数,说明已经被其他cpu抢占了,cpu休息一会,相当于pause指令
line  8: 继续将lock->slock和0比较,
line  9: 判断lock->slock是否小于等于0,如果判断为真,跳转到2,继续休息
line 10: 此时lock->slock已经大于0,可以继续尝试抢占了,跳转到

如何起到自旋等待的作用?