本文是操作系统进程同步互斥关于读者写者(生产者消费者)的基本实验。
一、需求
本课程实验内容引自《Windows 内核实验教程》(陈向群、林斌等编著,机械工业出版社,2002.9)。
在Windows 环境下,创建一个包含n 个线程的控制进程。用这n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:
- 写-写互斥
- 读-写互斥
- 读-读允许
读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。
二、运行环境
电脑硬件配置:
处理器:Intel i7 7700HQ
显卡:NVIDIA GeForce GTX 1050 Ti
内存:16GB
软件:
编程语言:C++
IDE:Microsoft Visual Studio 2019
Windows SDK版本:10.0
平台工具集:Visual Studio 2019(v142)
三、核心算法
读者优先:
点击查看代码
1 | //信号量: |
写者优先:
点击查看代码
1 | //信号量: |
输入:
- 屏幕输入:
- 1:选择读者优先,调用ReaderPriority(“thread.dat”)函数;
- 2:选择写者优先,调用WriterPriority(“thread.dat”)函数;
- 3:退出。
- 从thread.dat文件读入读者写者线程信息。
输出:
屏幕输出各读者写者线程信息。
五、测试样例:
输入1
可以看出,写者进程4、2、6虽然都请求了写操作,但是却是等待所有的读者1、3、5读完了再按顺序进行的写入操作,符合读者优先的要求。
输入2
可以看出,除了第一个读者进程1在读文件外,虽然读者3、5都请求了读操作,但由于写者进程4、2、6请求了写操作,因为写者优先,所以读者3、5都要等待写者4、2、6写入完成才能读,而写者4、2、6必须等待读者进程1读操作完成后才能写。读者1读操作完成后,写者4、2、6按顺序写入文件,写入完成后,读者3、5同时读文件,符合写者优先的要求。
输入3
释放线程,程序退出。
六、项目地址
本项目的源码、可执行程序均已经存放于我的Github,欢迎下载查看: