当前位置:文档之家› 需求分析和概要设计

需求分析和概要设计

一、需求分析说明
在Windows7环境下,创建一个控制台进程,此进程包含n 个线程。

用这n个线程来表示n个读者或写者。

每个线程按相应测试数据文件的要求进行读写操作。

用信号量机制分别实现读者优先和写者优先的读者-写者问题。

读者-写者问题的读写操作限制(包括读者优先和写者优先):
1) 写-写互斥,即不能有两个写者同时进行写操作。

2) 读-写互斥,即不能同时有一个线程在读,而另一个线程在写。

3) 读-读允许,即可以有一个或多个读者在读。

读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。

写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。

运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。

以下是各功能模块的功能描述:
1.主函数模块
判断进行读者优先还是写者优先。

2.读者优先-读者线程
定义互斥变量h_Mutex,通过WaitForSingleObject(h_Mutex,-1)实现对readcount的互斥访问。

3.读者优先-写者线程
当前读者进程全部结束后,等待的写者进程就可以申请资源EnterCriticalSection(&RP_Write)进行写操作。

4.写者优先-读者线程
定义互斥变量h_Mutex1,h_Mutex2,通过WaitForSingleObject(h_Mutex1,-1)读者进入临界区,同时通过h_Mutex2实现对readcount的互斥访问。

5.写者优先-写者线程
定义互斥变量h_Mutex3,实现对writecount的互斥访问。

6. 读写操作优先处理函数
从文件中读取相关数据,通过数组依次创建读者进程和写者进程,来协调程序的运行,直到所有的读写线程全部结束。

测试数据:
1 R 3 5
2 W 4 5
3 R 5 2
4 R 6 5
5 W 5.1 3
二、概要设计说明
1线程控制:
CreateThread 完成线程创建,在调用进程的地址空间上创建一个线程,以执行指定的函数;它的返回值为所创建线程的句柄。

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
DWORD dwStackSize, // initial stack size LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument DWORD dwCreationFlags, // creation option LPDWORD lpThreadId // thread identifier );
2 ExitThread 用于结束当前线程。

VOID ExitThread(
DWORD dwExitCode // exit code for this thread
);
3 Sleep 可在指定的时间内挂起当前线程。

VOID Sleep(
DWORD dwMilliseconds // sleep time
);
4信号量控制:
WaitForSingleObject 可在指定的时间内等待指定对象为
可用状态; DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);
hHandle为等待的对象,也就是实现同步或者互斥的对象。

该函数一执行,相应的信号量就减去1,如果信号量小于等于0,那么他一直在循环。

5 实现信号量互斥和同步
CreateSemaphore用于创建信号量,根据参数的不同可以利用它实现互斥和同步。

ReleaseSemaphore用于释放信号量,使用后相应的信号量加1
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//SD
LONG,lInitialCount, //initial count
LONG,lMaximumCount, //maximum count
LPCTSTR lpName //object name
); ReleaseSemaphore( HANDLE hSemaphore, LONG lRelseaseCount, LPLONG lpPreviousCount ); //handle to semaphore //cont increment amount //previous count 6控制流程
用CheckPersonList(PersonLists)函数检查PersonLists中是否有为创建的进程(读写者)。

如果有则创建相应的读写线程7创建读写者
用boolCreateReader(int StartTime,int WorkTime)函数创建读者写者相应的线程,其中由windows提供的函数为CreateThread (NULL,0,ReaderProc,
(LPVOID)pPerson,0,&dwThreadID);返回的是DWORD型变量。

在CreateReader(int StartTime,int WorkTime)中还会初始化相应的读写者的基本信息,例如何时申请数据何时读数据何时关闭线程等等。

8同步与互斥
WaitForSingleObject(信号量名字,infinite)和ReleaseSemaphore(信号量名字,1,null)用于实现同步于互斥,执行WaitForSingleObject(信号量名字,infinite)信号量相应的信号量减1,执行ReleaseSemaphore(信号量名字,1,null)恢复1。

9.主要数据结构
intreadCount:访问资源的读者线程数目;
intwriteCount:访问资源的写者线程数目;
CRITICAL_SECTIONRP_Writer:临界区对象,读者优先中用于阻塞写者;
CRITICAL_SECTIONCS_Writer:临界区对象,写者优先中实现写写互斥;
CRITICAL_SECTIONCS_Reader:临界区对象,写者优先中用于阻塞读者,体现写者优先;
struct Thread:线程信息结构体结构表示,成员变量包括int Number,char Type,doubleRunTime, WaitTime,分别代表线程序号,线程种类(读者或写者),等待时间,作业时间。

HANDLE Mutex1:互斥信号量,用于实现写者优先。

HANDLE Mutex2:互斥信号量,用于维护read_Count修改。

HANDLE Mutex3:互斥信号量,用于维护write_Count修改。

void ReaderPriority(char *file)\\读者优先主控程序
void RP_ReaderThread(void *p)\\读者优先-读者线程
void RP_WriterThread(void *p)\\读者优先-写者线程
void WriterPriority(char *file)\\写者优先主控程序
void WP_ReaderThread(void *p)\\写者优先-读者线程
void WP_WriterThread(void *p)\\写者优先-写者线程。

相关主题