| 
		    
                    
   与自旋锁相关的API主要有: 
  定义自旋锁 
 
  初始化自旋锁 
 
  该宏用于动态初始化自旋锁lock 
  获得自旋锁 
 
  该宏用于获得自旋锁lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放; 
 
  该宏尝试获得自旋锁lock,如果能立即获得锁,它获得锁并返回真,否则立即返回假,实际上不再"在原地打转"; 
  释放自旋锁 
 
  该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用; 
  除此之外,还有一组自旋锁使用于中断情况下的API。 
  下面进入对并发控制的实战。首先,在globalvar的驱动程序中,我们可以通过信号量来控制对int global_var的并发访问,下面给出源代码: 
 
    
        
            | 
             #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <asm/uaccess.h> #include <asm/semaphore.h>  MODULE_LICENSE("GPL");
  #define MAJOR_NUM 254
  static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*); static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);
  struct file_operations globalvar_fops = {  read: globalvar_read, write: globalvar_write, }; static int global_var = 0; static struct semaphore sem;
  static int __init globalvar_init(void) {  int ret;  ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);  if (ret)  {   printk("globalvar register failure");  }  else  {   printk("globalvar register success");   init_MUTEX(&sem);  }  return ret; } 
             | 
         
    
 
		    
                       
		      
		      
		   |