读者-写者问题实验报告计算机操作系统宣贯
本实验报告旨在通过设计和实现读者-写者问题,来展示计算机操作系统中的线程同步机制。读者-写者问题是一个经典的同步问题,涉及到多个线程同时访问共享资源的同步控制。
本实验报告分为四个部分:实验要求、测试数据文件格式、实习分析和相关 API 函数说明。
4.1 实验要求
在 Windows 环境下,创建一个控制台进程,该进程包含 n 个线程。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制包括:
* 写-写互斥,即不能有两个写者同时进行写操作。
* 读-写互斥,即不能同时有一个线程在读,而另一个线程在写。
* 读-读允许,即可以有一个或多个读者在读。
读者优先的附加限制:
* 如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:
* 如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态才能开始读操作。
4.1.1 测试数据文件格式
测试数据文件包括 n 行测试数据,分别描述创建的 n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。
4.1.2 实习分析
可以将所有读者和所有写者分别存于一个读者等待队列和一个写者等待队列中,每当读允许时,就从读者队列中释放一个或多个读者线程进行读操作;每当写允许时,就从写者队列中释放一个写者进行写操作。
读者优先可以用一个整型变量 read-count 记录当前的读者数目,用于确定是否需要释放正在等待的写者线程。每一个读者开始读文件时,必须修改 read-count 变量。因此需要一个互斥对象 mutex 来实现对全局变量 read-count 修改时的互斥。
写者优先可以用一个整型变量 write-count 记录正在等待的写者数目,当 write-count=0 时,才可以释放等待的读者线程队列。为了对全局变量 write-count 实现互斥,必须增加一个互斥对象 mutex3。
4.1.3 相关 API 函数说明
CreateThread 函数用于创建一个在调用进程的地址空间中执行的线程。函数原型:
HANDLE CreateThread(LPSECURITYATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREADSTARTROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
参数:
* lpThreadAttributes :指向一个 SECURITYATTRIBUTES 结构体,指定线程的安全属性。
* dwStackSize :指定线程的堆栈大小。
* lpStartAddress :指定线程的开始地址。
* lpParameter :指定线程的参数。
* dwCreationFlags :指定线程的创建标志。
* lpThreadId :指定线程的 ID。