读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以 是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和 一些只往数据区写数据的进程(Writer),此外还需要满足以下条件: (1) 任意多个读进程可以同时读这个文件; (2)一次只有一个写进程可以往文件中写;
(3)如果一个写进程正在进行操作,禁止任何读进程度文件. 我们需要分两种情况实现该问题:
读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待.
写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或 正在进行写操作,他要等待该写者完成写操作后才开始读操作.
2.3设计分析
在 Windows xp 环境下,创建一个包含 n 个线程的控制台进程.用这 n 个
线程来表示 n 个读者或写者. 每个线程按相应测试数据文件的要求, 进行读写操作. 请用信号量机制分别实现读者优先和写者优先的读者-写者问题. 读者-写者问题的读写操作限制:
读者-写者的读写限制(包括读者优先和写者优先) 1)写-写互斥,即不能有两个写者同时进行写操作
2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写 3)读读允许,即可以有 2 个以上的读者同时读
将所有的读者和所有的写者分别放进两个等待队列中, 当读允许时就让读者 队列释放一个或多个读者,当写允许时,释放第一个写者操作.读者写者问题的 定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存 的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数 据的进程(Writer),此外还需要满足以下条件:1)任意多个读进程可以同时读这 个文件;2) 一次只有一个写进程可以往文件中写;3)如果一个写进程正在进行操作,禁止任何读进程度文件.
3开发平台及源程序主要部分
3.1开发平台
Windows xp 系统下,VC++6.0开发 3.2源程序主要部分
结构体_Person如下 {
HANDLE m_hThread;//定义处理线程的句柄 int m_nType;//进程类型(读写) int m_nStartTime;//开始时间 int m_nWorkTime;//运行时间 int m_nID;//进程号 typedef struct _Person
}Person;
main()函数(主线程)
创建信号灯,当前可用的资源数为 1,最大为 100 : g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL)g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL)
调用CreatePersonList()函数,设置线程同步间隔为1000ms,计算时间片。
CreatePersonList(int *pPersonLists)函数
根据*pPersonLists队列创建读者/写者。
CreateReader(int StartTime,int WorkTime,int ID)函数
创建与读者有关的线程,并初始化g_Persons [g_NumPerson]
CreateWriter(int StartTime,int WorkTime,int ID)函数
创建与写者有关的线程,并初始化g_Persons [g_NumPerson]
DWORD WINAPI ReaderProc(LPVOID lpParam)和DWORD WINAPI WriterProc(LPVOID lpParam)
分别与读者和写者对应的辅助线程函数。
3.3程序流程图
WriterProc() CreateWriter() W Main() CreatePersonList() R CreateReader() ReaderProc() 退出
4 测试用例和运行结果
4.1测试用例
int g_PersonLists[] = { 1, W,1,3, 2, W,3,1, 3, R,10,2, 4, W,6,3, 5, R,7,5, 6, R,9,1, END, };
4.2运行结果
4.3运行结果分析
进程1是写操作,在时间片1进入队列,运行时间3,在它进入时没有进程占用资源,立即占用资源,直到释放资源。在它占用资源时等待的进程有:2
进程2是写操作,在时间片3进入队列,运行时间1,由于进程1在占用资
源,所以等待进程1释放资源。在它占用资源时没有等待的进程
进程3是读操作,在时间片10进入队列,运行时间2,此时读者5在占用资
源,但由于可以多个读者同时阅读,所以读者3也可以阅读
进程4是写操作,在时间片6进入队列,运行时间3,此时没有进程占用资
源,它可以立即占用资源,直到结束并释放资源。在它占用资源时等待的进程有:5,6
进程5是读操作,在时间片7进入队列,运行时间5,由于此时进程4在占
用资源,所以等待进程4释放资源。
相关推荐: