读者写者问题 自旋锁
来源:互联网 发布:淘宝商家的联系方式 编辑:程序博客网 时间: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");
#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
- 读者写者问题 自旋锁
- 读者写者问题
- 读者写者问题
- 读者-写者问题
- 读者写者问题
- 读者写者问题
- 读者-写者问题
- 读者-写者问题
- 读者-写者问题
- 读者写者问题
- 读者-写者问题
- 读者-写者问题
- 读者写者问题
- 读者-写者问题
- 读者写者问题
- 读者-写者问题
- 读者写者问题
- 读者写者问题
- week after week----行到水穷处,坐看云起时
- SenchaTouch2.3.1 中使用listpaging以及pullrefresh插件 做的分页示例
- ftk学习记(消息框篇)
- POJ 1324 Holedox Moving(图论:BFS)
- Android WifiManager.WifiLock 简介
- 读者写者问题 自旋锁
- C++课上ppt3复习 Operator Overloading
- 毕业设计使用SSH框架遇到的问题及解决方法
- Linux下的bochs安装
- Difference Between FPGA and CPLD
- 《Python核心编程》第2章 习题
- 手工编写CakePHP模式
- hadoop2.0 新一代map reduce 框架 yarn 配置
- 大型JavaScript应用程序架构模式