读写优先问题
来源:互联网 发布:大麦网 数据 编辑:程序博客网 时间:2024/06/07 05:57
关于读写问题的
读优先
代码如下:
Mutex WR =1;Mutex CountMutex =1;int count=0;//首先编写write的大概框架;void write(){ //由于读写以及写写之间需要互斥,所以使用WR隔离; //保证了写与写以及读与写之间的互斥; P(WR); write operation; V(WR); }// read的大概框架如下,其中为了保证读与读之间不互斥,而读与写之间互斥// 主要通过记录当前读者的个数;void read(){ P(CountMutex); if(count==0)//表明当前是第一个读者,需要获得读写锁 P(WR); count++;//在获取之后需要++表明已经有读写获取读写锁,并且变量操作要互斥 V(CountMutex); read(); P(CountMutex); count--; if(count==0)//在当前没有读者的时候,需要释放资源 V(WR); V(CountMutex);}//以上的编写需要注意读者何时取得资源与何时释放资源,以上的写法只是为了读与读之间可以并行的进行读操作,而在进行读操作时可以与写隔离;//上面的编写仍然存在一个问题就是,在写操作进行时候,如果此时如果有写者先等待资源,这个时候如果同时有读者等待资源,这样并不能保证读者优先执行,所以为了保证绝对的读者优先,需要让用一个互斥量让后续的写者排队;额外定义:Mutex QueMutex=1;因此写者可以这样写:void write(){ //由于读写以及写写之间需要互斥,所以使用WR隔离; //保证了写与写以及读与写之间的互斥; P(QueMutex);//这样保证了一旦有写者执行后面的写进程会等待队列资源而不是读写资源,保证了读操作的绝对优先; P(WR); write operation; V(WR); V(QueMutex);}
写优先
写优先需要注意,如果有读写进程同时在等待,需要优先执行写;结合上面的读优先,可以先把框架搭好;Mutex WR =1; //读写资源;Mutex RCountMutex =1;Mutex WCountMutex =1;Mutex QueMutex =1;int WCount = 0;int RCount = 0;void write(){ //模仿之前的读者写,但是注意谢谢之间还是互斥的; P(WCountMutex); if(WCount==0) P(QueMutex);//先获得排队资源;保证一旦有写者在,后面的写者 WCount++; //就不需要排队了; V(WCountMutex); P(WR); //进行读写资源互斥 write operation; V(WR); P(WCountMutex); WCount--; if(WCount==0) V(QueMutex); V(WCountMutex); }//先把最基本的框架写好;void read( ){ P(RCountMutex); if(RCount==0) P(WR); RCount++; V(RCountMutex); read operation; P(RCountMutex); RCount--; if(Rcount==0) P(WR); V(RcountMutex); }//接下来考虑如果读写进程同时排队如何保证写进程优先获得资源;就像写者那样,读者也需要排队,需要保证如下两点:
1.读进程如果正在执行,此时如果一旦有写进程在等待,则优先执行写;
2.写进程如果在执行,后面的写不需要排队直接等待读写资源;
read改造如下:
额外声明: Mutex TempMutex =1;
void read( ){ P(TempMutex);//保证有且仅有一个读者在等待队列资源,其余的卡在了这个互斥量上 P(QueMutex); //保证在等待队列资源; P(RCountMutex); if(RCount==0) P(WR); RCount++; V(RCountMutex); V(QueMutex); V(TempMutex); read operation; P(RCountMutex); RCount--; if(Rcount==0) P(WR); V(RcountMutex); }
//用信号量做写优先的问题的时候,读需要好好斟酌一下,这里面为了保证绝对的优先级,在读者上做的事情与 读优先时所做的事情一致!
关于公平读写 ,也是利用了排队的思想,很简单这里不再赘述,如有任何问题欢迎批评指正,以上均为伪代码,注重的是逻辑,你也可以通过pthread等一些线程库进行实际的编写。
只要你脑子有相应的逻辑,代码的编写自然水到渠成!
阅读全文
1 0
- 读写优先问题
- 读写锁写锁优先的坑
- 讨论个问题吧,只用MUTEX,你能实现一个写者优先的读写锁吗?
- linux 读写锁(写优先)使用方法
- pthread读写锁,写优先设置
- 一个写优先的读写锁实现
- 行优先和列优先的问题
- 迷宫问题(广度优先)
- mfc 控件重叠优先问题
- 关于"*"和"++"优先度问题
- 城堡问题 ------ 深度优先搜索
- 迷宫问题-广度优先搜索
- 迷宫问题-广度优先搜索
- 广度优先搜索:迷宫问题
- 样式表优先级别问题
- Linux下写者优先的读写锁的设计
- Linux下写者优先的读写锁的设计
- 利用信号实现写优先的读写锁
- nfs连接
- Spring Tool Suite(STS3.9.0)自动导包快捷键设置问题
- OkHttp深入理解(3)BridgeInterceptor与CacheInterceptor
- 国庆清北刷题冲刺班 Day1 上午
- mysql 查询当天、本周,本月,上一个月的数据
- 读写优先问题
- org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
- 25个常用的Linux iptables规则
- Web上的用户登录功能安全
- File IO(NIO.2):什么是路径?
- 将博客搬至CSDN
- ABAP COLLECT语句用法深入解析
- Mysql数据库安装及配置
- 华为推送的自定义推送与自定义字段