我的操作系统课程设计,希望高手给解答一下

来源:百度知道 编辑:UC知道 时间:2024/07/06 19:12:54
创建一个控制台进程。此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制(包括读者优先和写者优先):
1)写-写互斥,即不能有两个写者同时进行写操作。
2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。
3)读-读允许,即可以有一个或多个读者在读。
读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。
1.2 实验环境
windows 2000/xp ,visual c++

1.3测试数据文件格式
测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者,w表示写者。第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。
下面是一个测试数据文件的例子:
1 R 3 5
2 W 4 5
3 R 5 2
4 R 6 5
5 W 5.1 3
由于牵涉格式的问题,最好在记事本中手工逐个键入数据,而不要拷贝粘贴数据,

下面是我们实验的材料,你可以看一下,基本一样,只要把main函数中线程创建的代码根据读取的数据改一下就行了。

例2:用信号量实现的读者写者问题
读者写者问题也是一个典型的同步互斥问题。考虑一个数据库系统,多个执行实体同时
对数据库进行读操作肯定是没有问题的,但只要有一个执行实体在对数据库进行写操作时,
其他执行实体不论是读还是写,均不能进行。
在我们的例子中我们使用3 个线程模拟读者的行为,2 个线程模拟写者的行为。3 个读
者的行为基本类似,2 个写者的行为也基本类似。5 个线程之间的同步互斥机制使用信号量。
假定读者和写者要访问的公共数据为一个字符型的全局变量bookcontent,3 个读线程的行
为是不断地读取这个变量的值,并将其输出。为了使得大家能够较清楚地看到线程的运行结
果,我们在程序中插入了一些随机睡眠的代码,以便于读线程能够执行得“慢”一些,能够
有较多的机会主动放弃CPU 的占有。另外,程序中定义了两个句柄m_h 和db_h,分别指向
两个信号量,其中m_h 用于互斥访问读者计数变量rc,db_h 用于读者与写者以及写者与写
者之间的互斥。下面是三个读者的代码。
// readerwriter.cpp
//
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#define MAX_DELAY_READER 10
#define MAX_DELAY_WRITER 100
char bookcontent='?';
int rc=0;
HANDLE m_h,db_h,r_h[3],w_h[2];
DWORD WINAPI reader1(PVOID pvParam) {
int n;
while (1) {
printf("The reader 1 is trying to