if((w_wait[0]>=0)&&(w_wait[0] 模拟读之后对Rmutex的V操作: void V_rsub(int i) { Rmutex++; } 4测试用例,运行结果与运行情况分析 4.1测试用例 测试用例如下: 1、输入写者个数:4 2、输入读者个数:2 3、写者1申请写操作,此时状态:写者1正在写 4、读者1申请读操作,此时状态:写着1正在写,读者1等待 6、写者1完成写操作,此时状态:读者1正在读 7、读者2申请读操作,此时状态:读者1正在读,读着2正在读 8、写者3申请写操作,此时状态:读者1正在读,读者2正在读,写着3等待9、读者1完成读操作,此时状态:读者2正在读,写着3等待 10、读者2完成读操作,此时状态:写者3正在写 11、写者2申请写操作,此时状态:写者3正在写,写者2等待 12、写者3完成写操作,此时状态:写者2正在写 13、写者2完成写操作,此时状态:无读无写 14、写者4申请写操作,此时状态:写者4正在写 15、读者1申请读操作,此时状态:写着4正在写,读者1等待 16、读者2申请读操作,此时状态:写着1正在写,读者1等待,读者2等待 17、写者4完成写操作,此时状态:读者1正在读,读者2正在读 18、结束 6 4.2运行结果 运行结果如图: 7 8 4.3运行情况分析 当有读者对文件读时,写操作等待,读操作执行 当有写者对文件写时,读操作等待,写操作等待 完全符合限制规则及实际应用 5自我评价与总结 本次设计中,用C++编程模拟了用信号量机制实现读者和写者问题。 总的来说,通过本次设计收获很大。读者和写者问题,一直认为这些东西很简单,但 9 是具体编程实现其模拟并不容易。虽然这还不算真正的实践,但通过这次设计,向实践靠近了一步。更加深刻的理解了操作系统中这些理论知识的意义。同时也让我温习以前所学习的高级语言。 6 参考文献 [1] 报刊《计算机教育》文章编号1672-5913(2011)22-0056-03,《操作系统课程之“读者-写着”问题教学探讨》 [2] 严蔚敏,吴伟民著,数据结构(c++版)北京:清华大学出版社,2007 7 附录:(完整代码) #include int Wmutex=1;//表示允许写或允许读 int readCount=0;//表示正在读的进程数 int Rmutex=1;//表示对Rcount的互斥操作 int r[10]={0,0,0,0,0,0,0,0,0,0};//表示读者的状态,1表示正在读 int w[10]={0,0,0,0,0,0,0,0,0,0};//表示写者的状态,1表示正在写 int w_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//表示等待队列,0-9表示写者,10时需引入读者的等待队列,-1表示空 int r_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//读者的等待队列,0-9表示对应的读者,-1为空 void P_write(int);//模拟写者对Wmutex的P操作,同时也作为写者进程的入口 void write(int);//开始写操作 void V_write(int);//模拟写者对Wmutex的V操作,写操作完成的时候调用 void P_radd(int);//模拟读之前对Rmutex的P操作,同时也作为读者进程的入口 void radd(int);//readCount加1 void P_read(int);//模拟读者对Wmutex的P操作 void V_radd(int);//模拟读之前对Rmutex的V操作 void read(int);//读操作 void P_rsub(int);//模拟读之后对Rmutex的P操作,读操作完成的时候调用 void rsub(int);//readCount减1 void V_read(int);//模拟读者对Wmutex的V操作 void V_rsub(int);//模拟读之后对Rmutex的V操作 void P_write(int i) { Wmutex--; 10