sp;ReaderPriority("thread.dat");
else
WriterPriority("thread.dat");
printf("\nPress Any Key to Coutinue:");
_getch();
system("cls");
}
return 0;
}
4.2.thread.dat //辅助的文件,但是必不可以少
1 r 3 5
2 w 4 5
3 r 5 2
4 r 6 5
5 w 5.1 3
5.运行结果与运行情况
对源程序进行编译,链接后,执行程序:
当选择1 Reader Priority 时,程序运行结果如下:
按任意建后会到主界面,然后选择2.Writer Priority 后,程序运行结果如下:
6.调试记录
在编程过程中,没有设置计数器来存储读者数目,结果在程序运行时,产生了读者与读者的互斥。之后通过翻阅资料,了解了需要加入计数器来控制读者与读者之间的同等优先,同时也用于控制写者进程的释放,既当计数器为0的时候,允许写进程访问文件。
在加入计数器后,重新编写程序,就解决了以上问题。当程序通过编译链接之后,运行程序,得到了正确的结果。然后修改文件thread.dat中的参数:
1 R 3 4
2 R 4 3
3 W 4 5
重新对程序进行测试,分别选择读者优先和写者优先,结果正确。
最后修改文件thread.dat中的参数,使用更多的读写请求:
1 W 2 5
2 R 3 4
3 W 5 3
4 R 6 5
5 R 7 4
6 W 9 5
7 R 11 4
8 R 14 5
9 W 17 6
10 R 20 5
运行程序的结果都正确。读者写者问题程序设计成功。
7.自我评析和总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.
操作系统的出现,使用和发展是近四十余年来计算机软件的一个重大进展。操作系统中引入并发程序设计技术后,程序的执行不在是顺序的。一个程序未执行完而另一个程序便已开始执行,程序挖补的顺序特性消失,程序与计算不再一一对应,所以操作系统引进进程概念来描述这种变化。读者与写者问题就是一个经典的并发程序设计问题。
在开始做课程设计时,我首先翻阅了很多关于并发程序的书籍,找到了基本的解决方法,那就是信号量的使用。记录型信号量和PV操作不仅可以解决进程的互斥,而且更是实现进程同步的有力工具。但是发现光有信号量是解决不了读者和写者问题,因为所有读进程不会相互互斥。所以程序对信号量进行了改进。引入了一个计数器,记录读者的数目,控制是否释放写者进程。
做到这些,思路已经基本确定。在变成过程中查阅了许多书籍,也对WINDOWS下的一些API做了些了解。
接近2周的课程设计,让我学到了不少东西,从开始的查阅书籍,确定思路,到最后的编写程序和调试。设计过程中遇到了不少困难,但在同学和老师的帮助下都一一克服了。
总之,每一次课程设计不仅是我们学习的好机会,而且是我们锻炼实际动手能力的平台,虽然有难度的东西总会让人很抵触,比如在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中能够磨练人的意志与耐心,最后感谢老师的指导与监督,使我在课程设计过程中学到了书本是学不到的知识,同时也对操作系统有了更深刻的认识,为以后的学习打下了坚实的基础。