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

posted @ 2012-08-03 09:28  软件小书童  阅读(132)  评论(0)    收藏  举报