最近在学习操作系统,对读者写者问题进行了实现,还存在部分问题。

关系:读者与写者互斥、写者与写者互斥  写者优先
    临界资源:书(一本)
    分析:互斥可用互斥信号量mutex,写者优先可设置w
          写者获得写权限w,获得书后可进行对书的修改
          第一个读者需要获得书的权限,后面的读者不必,最后一个读者读完时释放书

代码:

/*Project: 读者写者问题Date:    2018/08/05Author:  Frank Yu关系:读者与写者互斥、写者与写者互斥  写者优先临界资源:书(一本)分析:互斥可用互斥信号量mutex,写者优先可设置w写者获得写权限w,获得书后可进行对书的修改第一个读者需要获得书的权限,后面的读者不必,最后一个读者读完时释放书
*/
#include<iostream>
#include<string>
#include<algorithm>
#include<Windows.h> //多线程编程
#include<process.h>
using namespace std;
//变量声明初始化**********************************************************************************int readercount=0;//读者数量 HANDLE rc_mutex;//因为读者数量而添加的互斥信号量HANDLE w;//实现写者优先HANDLE book;//互斥访问书籍//进程管理-读者线程
unsigned __stdcall threadReader(void *)
{for(int i = 0; ; i++){WaitForSingleObject(w, INFINITE);//判断写者是否再写WaitForSingleObject(rc_mutex, INFINITE);//对readercount互斥访问if(readercount==0)WaitForSingleObject(book, INFINITE);//第一位读者申请书readercount++;Sleep(100);ReleaseSemaphore(rc_mutex, 1, NULL);//释放互斥信号量rc_mutexReleaseSemaphore(w, 1, NULL);//释放写者优先信号量cout<<readercount<<"位读者在读书..."<<endl;//读者读书WaitForSingleObject(rc_mutex, INFINITE);//修改readercountreadercount--;//读者读完if(readercount==0)ReleaseSemaphore(book, 1, NULL);//释放书籍,写者可写ReleaseSemaphore(rc_mutex, 1, NULL);//释放互斥信号量rc_mutex}return 1;
}
//进程管理-写者线程
unsigned __stdcall threadWriter(void *)
{for(int i = 0; ; i++){WaitForSingleObject(w, INFINITE);//申请写权限WaitForSingleObject(book, INFINITE);//申请书cout<<"写者在修改书籍..."<<endl;Sleep(100);ReleaseSemaphore(book, 1, NULL);//释放书ReleaseSemaphore(w, 1, NULL);//释放权限}return 2;
}
//算法及功能*********************************************************************
//读者写者算法模拟
void process_ReaderAndWriter()
{//创建信号量w = CreateSemaphore(NULL, 1, 1, NULL);//实现写者优先信号量,初值为1,最大值为1rc_mutex = CreateSemaphore(NULL,1,1,NULL);//读者对count修改互斥信号量,初值为1,最大为1book = CreateSemaphore(NULL, 1, 1, NULL);//书籍互斥访问信号量,初值为1,最大值为1HANDLE hth1, hth2;                     //线程句柄//创建线程hth1 = (HANDLE)_beginthreadex(NULL, 0, threadReader, NULL, 0, NULL);//读者线程hth2 = (HANDLE)_beginthreadex(NULL, 0, threadWriter, NULL, 0, NULL);//写者线程//等待子线程结束WaitForSingleObject(hth1, INFINITE);WaitForSingleObject(hth2, INFINITE);//一定要记得关闭句柄CloseHandle(hth1);CloseHandle(hth2);CloseHandle(w);CloseHandle(rc_mutex);CloseHandle(book);
}
//主函数*********************************************************************
int main()
{cout<<"*************欢迎进入读者写者模拟程序****************"<<endl;process_ReaderAndWriter();return 0;
}

结果截图:

读者写者

从结果可以看出,一直是只能一个读者读书,看代码并不能看出什么问题,请大神指教。。。

实现的写者优先是相对的,写者会在w的阻塞队列中等待,当读者(包括w的阻塞队列中写者前的读者)读完后,才可写。

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

操作系统-读者写者问题,写者优先,多个读者可以同时读书(C++实现)相关推荐

  1. 【操作系统】读者写者问题——写者优先、寿司店问题 题目+答案

    噩梦来啦~ 一]讲解 同步:多进程按一定顺序执行 互斥:多进程操作同一个临界资源 信号量>0,说明它空闲.所测试的线程可以锁定而使用它. 信号量=0,说明它被占用,测试的线程要进入睡眠队列中,等 ...

  2. OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)

    一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...

  3. 读者写者问题(超级详细的分析读者优先,读写平等,写者优先)

    我的记忆力比较差,明明详细分析过的问题,没过多久,忘得一干二净:还是把分析过程写下来,若有差错,也请各路大神不吝赐教. 正文: 先简单的陈述一下问题: 一个数据记录,有多个进程进行读操作,另一些进程进 ...

  4. 清华学霸直博简历火了!CPU、操作系统、编译器全自主写,刘知远点赞

      新智元报道   来源:知乎.blog.miskcoo等 清华大学直博面试的一则简历上了知乎热榜:"实现了在自己写的CPU上运行自己写的操作系统,以及自己实现的编译器生成的程序" ...

  5. java 读者写者_Java实现生产者消费者问题与读者写者问题详解

    1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两 ...

  6. 别人家的孩子!CPU、操作系统、编译器全自主写,刘知远点赞!

    点击蓝色"五分钟学算法"关注我哟 加个"星标",天天中午 12:15,一起学算法 来源 | 新智元 最近,一个来自福州的男生突然火了,原因是知乎上一个热帖< ...

  7. 清华学霸直博简历火了!CPU、操作系统、编译器全自主写

    来源:知乎.blog.miskcoo等 转自:新智元 清华大学直博面试的一则简历上了知乎热榜:"实现了在自己写的CPU上运行自己写的操作系统,以及自己实现的编译器生成的程序".简历 ...

  8. 清华学霸讲计算机,清华学霸直博简历火了:CPU、操作系统、编译器全自己写

    原标题:清华学霸直博简历火了:CPU.操作系统.编译器全自己写 程序猿(ID:imkuqin) 整编 综合自:zibuyu9微博.https://www.zhihu.com/question/3457 ...

  9. 深入理解操作系统(16)第六章:存储器层次结构(2)高速缓存存储器+对程序性能的影响(包括:L1/L2高速缓存历史/缓存写:直写和写回/暂无L4级缓存/缓存命中率/存储器山/高速缓存友好的代码/)

    深入理解操作系统(16)第六章:存储器层次结构(2)高速缓存存储器+对程序性能的影响(包括:L1/L2高速缓存历史/缓存写:直写和写回/暂无L4级缓存/缓存命中率/存储器山/高速缓存友好的代码/) 1 ...

最新文章

  1. UIColor and components
  2. 阿里云企业邮箱收费吗
  3. 嵌入式系统实验 构建嵌入式Linux系统,《嵌入式系统与开发》构建嵌入式Linux系统-实验报告.doc...
  4. 张莉python 玩转数据答案_大学mooc2020年用Python玩转数据课后答案
  5. C#解析JSON字符串总结
  6. 性能测量工具类——TimeMeasureUtil TimeMeasureProxy
  7. 《剑指Offer》 二叉树的镜像
  8. Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...
  9. 《Python语言程序设计》二级教程课后编程题及答案
  10. FC协议监控卡(FC协议分析仪),FC Monitor
  11. 《教练型领导力》--司铭宇老师
  12. java 线程通讯道通信就_java线程间通讯的一些方法总结
  13. MaaS出行即服务简单介绍
  14. 数据结构串之寻找整数
  15. nums和nums[:]
  16. Python的字符串方法join(插入间隔符)
  17. $%7BpageContext.request.contextPath%7D
  18. 朴素贝叶斯应用案例 —— 商品评论情感分析
  19. 你听播客吗?聊聊最近大火的声音经济
  20. Cadence IC设计环境搭建( IC617+MMSIM151+Calibre2015)

热门文章

  1. RTKLIB源码及介绍
  2. 萤幕不再输- iPhone 6 与各 Android 旗舰并排比 [图库]
  3. 开关电源- 用PFC拓扑电路对比
  4. 实用新型专利申请材料
  5. python图像降采样_OpenCV:十一、图像上采样和降采样
  6. 互联网巨头为何偏爱“二手货”?告诉你真实的理由
  7. Freemarker使用xml写word模板-遇到的坑
  8. CMD命令进入指定目录
  9. 已重置应用默认设置html,教大家Win10已重置应用默认设置的解决方法
  10. 铝板展开插件_喀什地区莎车县5083铝板 产品使用误区