您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页需求分析和概要设计

需求分析和概要设计

来源:华佗小知识
一、需求分析说明

在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)\\\\写者优先-写者线程

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务