进程同步模拟设计 - 读者和写者问题

loading 分享 2026-9-4 下载文档

读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以 是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(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释放资源。


进程同步模拟设计 - 读者和写者问题.doc 将本文的Word文档下载到电脑
搜索更多关于: 进程同步模拟设计 - 读者和写者问题 的文档
相关推荐
相关阅读