Linux内核中的自旋锁
自旋锁不会引起睡眠,当一个进程在访问内核无法获取自旋锁时,会进入忙循环,一直等待下去。
实例:
Pcilynx.c (\linux-2.6.30.4\drivers\ieee1394)
1 声明
1 struct ti_lynx { 2 int id; /* sequential card number */ 3 spinlock_t lock; 4 ... 5 }; 6 7 struct ti_lynx *lynx;
2 初始化
1 spin_lock_init(&lynx->lock);
3 使用
在函数 static pcl_t alloc_pcl(struct ti_lynx *lynx) 中
用于对临界资源的保护 critical section code
1 static pcl_t alloc_pcl(struct ti_lynx *lynx) 2 3 { 4 5 u8 m; 6 7 int i, j; 8 9 10 spin_lock(&lynx->lock); //获取锁 11 12 /* FIXME - use ffz() to make this readable */ 13 14 for (i = 0; i < (LOCALRAM_SIZE / 1024); i++) { 15 16 m = lynx->pcl_bmap[i]; 17 18 for (j = 0; j < 8; j++) { 19 20 if (m & 1<<j) { 21 22 continue; 23 24 } 25 26 m |= 1<<j; 27 28 lynx->pcl_bmap[i] = m; 29 30 spin_unlock(&lynx->lock); //释放锁 31 32 return 8 * i + j; 33 34 } 35 36 } 37 38 spin_unlock(&lynx->lock);//获取锁 39 40 return -1; 41 42 }
另外一个用法
spin_try_lock(&lynx->lock) //获取锁,如果获取返回true,否则返回false
浙公网安备 33010602011771号