读者写者问题
2016-04-17 10:57
204 查看
读者优先:
读者进程执行:
无其他读者写者, 直接执行
有写者等, 但其他读者在读, 直接读
有写者写, 等待
写者进程执行:
无其他读写者, 直接执行
有其他读写者, 等待
伪代码描述:
写者优先(这个是我自己想出来的, 不是标准答案, 望指出错误):
读者进程执行:
如果此时没有写者等待, 直接执行
如果有写者等待, 那么等待
写者进程执行:
如果没有其他写者, 那么执行
如果有其他读写者, 那么等待
伪代码描述:
读者进程执行:
无其他读者写者, 直接执行
有写者等, 但其他读者在读, 直接读
有写者写, 等待
写者进程执行:
无其他读写者, 直接执行
有其他读写者, 等待
伪代码描述:
//R: 信号量, 初值为1 , 用于同步读者之间 //mutx: 信号量, 初值为1, 用于互斥读者与写者, 或者写者与写者 //rc: 用于统计当前有多少读者进程 void reader() { while (TRUE) { P(R); rc = rc + 1; if (rc == 1) P(mutex); V(R); 读操作 P(R); rc = rc - 1; if (rc == 0) V(mutex); V(R); 其他操作 } } void writer() { while (TRUE) { P(mutex); 写操作 V(mutex); } }
写者优先(这个是我自己想出来的, 不是标准答案, 望指出错误):
读者进程执行:
如果此时没有写者等待, 直接执行
如果有写者等待, 那么等待
写者进程执行:
如果没有其他写者, 那么执行
如果有其他读写者, 那么等待
伪代码描述:
//mutex 信号量: 初值为1, 控制对临界区的访问 //W 信号量: 初值为1 , 用于写者之间同步 //R 信号量: 初值为1 , 用于读者之间同步 //RW 信号量: 初值为1, 用于读者与写者之间同步 //rcount 初值为0 : 用于统计当前有多少读者 //wcount 初值为0 : 用于统计当前有多少写者 void reader() { while(true) { P(RW) ; P(R) ; rcount++ ; if(rcount == 1) P(mutex) ; V(R) ; V(RW) ; 读操作 P(R) ; rcount-- ; if(rcount == 0) V(mutex) ; V(R) ; } } void writer() { while(true) { P(W) ; wcount++ ; if(wcount == 1) P(RW) ; V(W) ; P(mutex) 写操作 V(mutex) P(W) ; wcount-- ; if(wcount == 0) V(RW) ; V(W) ; } }
相关文章推荐
- android图片的缓存--节约内存提高程序效率
- 主机开启后,显示器显示NO SIGNAL,无信号
- nefu500网购【二分+网络流】
- 算法复习之快排
- 24. Swap Nodes in Pairs
- 显示联系人列表2 分类标题栏
- 浅谈管道模型(Pipeline)
- mac 下安装 mongodb
- Poco 之cppunit解读
- 进程调度
- 端口表
- Android LayoutInflater详解
- 算法复习之快排
- MAC下 Redis php扩展安装
- maven如何修改本地仓库与中央仓库
- 欢迎使用CSDN-markdown编辑器
- D - I Think I Need a Houseboat(1.3.1)
- opencl:kernel中两种向量类型转换(convert_T,as_typen)的主要区别
- Oracle数据库修改Number字段属性
- kubernetes安装教程(CentOS7 )