读者写者问题 自旋锁

来源:互联网 发布:淘宝商家的联系方式 编辑:程序博客网 时间:2024/06/03 14:20
#include <linux/init.h>  
#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/delay.h>


#include <linux/sched.h>  
#include <linux/semaphore.h>  
#include <linux/spinlock.h>  
  
MODULE_LICENSE("GPL");  
  
static int count=0,num=0,readcount=0,writer=0,writecount=0;  
struct semaphore sem_w,sem_r;  
  
spinlock_t lock1=SPIN_LOCK_UNLOCKED;  
  
int ThreadRead(void *context)  
{  
    down(&sem_r);  
    spin_lock(&lock1);  
    readcount++;  
    if(readcount==1)  
        down(&sem_w);  
    spin_unlock(&lock1);  
    up(&sem_r);  
  
    printk("<2>" "Reader %d is reading!\n",readcount);  
    msleep(10);  
    printk("<2>" "Reader is over!\n");  
  
    spin_lock(&lock1);  
    readcount--;  
    if(readcount==0)  
        up(&sem_w);  
    spin_unlock(&lock1);  
  
    return count;  
}  
  
int ThreadWrite(void *context)  
{  
    spin_lock(&lock1);  
    writecount++;  
    if(writecount==1)  
        down(&sem_r);  
    spin_unlock(&lock1);  
      
    down(&sem_w);  
    writer++;  
    printk("<2>" "Writer %d is writting!\n",writer);  
    msleep(10);  
    printk("<2>" "Writer %d is over!\n",writer);  
    up(&sem_w);  
  
    spin_lock(&lock1);  
    writecount--;  
    if(writecount==0)  
        up(&sem_r);  
    spin_unlock(&lock1);  
  
    return count;  
}  
  
static __init int rwsem_init(void)  
{  
    static int i;  
    //init_MUTEX(&sem_r);  2.6.25及以后的linux内核版本废除了init_MUTEX函数
    //init_MUTEX(&sem_w); 新版本使用sema_init函数
sema_init(&sem_r, 1);
sema_init(&sem_w, 1); 
    for(i=0;i<2;i++){  
        kernel_thread(ThreadWrite,&i,CLONE_VM);  
    }  
  
    for(i=0;i<2;i++){  
        kernel_thread(ThreadRead,&i,CLONE_KERNEL);  
    }  
    for(i=2;i<5;i++){  
        kernel_thread(ThreadRead,&i,CLONE_KERNEL);  
    }  
    for(i=2;i<5;i++){  
        kernel_thread(ThreadWrite,&i,CLONE_KERNEL);  
    }  
  
    return 0;  
}  
  
static void rwsem_exit(void)  
{  
  
}  
  
module_init(rwsem_init);  
module_exit(rwsem_exit);  
  
MODULE_AUTHOR("Mike Feng");
0 0