资源简介
读者-写者问题的读写操作要求:
1.写-写互斥:不能有两个写者同时进行写操作
2.读-写互斥:不能同时有一个线程在读,而另一个线程在写。
3.读-读允许:可以同时有多个读者在读。
读者优先时,读者的优先权比写者高, 如果读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。如果当前是写者已经占有了文件的时候,则别的读者必需等待该操作完成后,才能开始读操作。
写者优先时,写者的优先权比读者高, 在一个写者提出要访问文件时,就必须使其尽可能的得到文件,而且不用调配,而且写者在运行时不允许读者进入。
代码片段和文件信息
#include
#include
#include
////使用文件
struct ThreadInfo //线程信息
{ int Threadid; //编号
char ThreadClass;//类别
double ThreadBeginTime; //开始时间
double ThreadStayTime;//读写持续时间
};
struct Monitor{//管程包括互斥变量和多个线程
struct ThreadInfo thread_info[100];
HANDLE h_Mutex;//互斥变量
CRITICAL_SECTION RP_Write;//设置临界区
CRITICAL_SECTION cs_Write;
CRITICAL_SECTION cs_Read;
}monitor;//定义一个名为monitor的管程
/////////////函数声明
void Reader_first();//读者优先函数
void R_ReaderThread(void *p);//处理读者优先时的读者
void R_WriterThread(void *p);//处理读者优先时的写者
void Writer_first();//写者优先函数
void W_ReaderThread(void *p); //处理写者优先时的读者
void W_WriterThread(void *p); //处理写者优先时的写者
void readfile(char* file);//读取文件内容,并创建相应读者和写者
void quit();//退出程序
/*CRITICAL_SECTION RP_Write;//设置临界区
CRITICAL_SECTION cs_Write;
CRITICAL_SECTION cs_Read;*/
int ReaderNum=0; //读者数目
int WriterNum=0; //写者数目
void readfile(char* file)
{
DWORD wait_for_all;//等待所有线程结束
DWORD thread_no=0;//读者写者总数初值为0
DWORD thread_ID; //ID
HANDLE h_Thread[100];//线程对象数组,最大100
ifstream inFile;
inFile.open(file);
while (inFile)
{//读入每一个读者、写者的信息
inFile>>monitor.thread_info[thread_no].Threadid
>>monitor.thread_info[thread_no].ThreadClass
>>monitor.thread_info[thread_no].ThreadBeginTime
>>monitor.thread_info[thread_no].ThreadStayTime;
if (inFile.get()==‘#‘)
break;//文件结束
thread_no++;//线程数加一
}
for (int i=0;i<(int)(thread_no);i++)
{
if (monitor.thread_info[i].ThreadClass==‘r‘||monitor.thread_info[i].ThreadClass==‘R‘)
//创建读者
h_Thread[i]=CreateThread(NULL0(LPTHREAD_START_ROUTINE)(R_ReaderThread)&monitor.thread_info[i]0&thread_ID);
else
//创建写者
h_Thread[i]=CreateThread(NULL0(LPTHREAD_START_ROUTINE)(R_WriterThread)&monitor.thread_info[i]0&thread_ID);
}
inFile.close();
wait_for_all=WaitForMultipleobjects(thread_noh_ThreadTRUE-1);
cout< //读者优先函数
void Reader_first()
{
//临界资源
HANDLE h_Mutex;
//互斥对象(h_Mutex)确保线程拥有对单个资源的互斥访问权
h_Mutex=CreateMutex(NULLFALSE“mutex_for_ReaderNum“);
ReaderNum=0;
InitializeCriticalSection(&monitor.RP_Write); //初始化临界区
cout<<“The reader first:\n“< readfile(“RandW.txt“);
}
//读者优先读者
void R_ReaderThread(void *p)
{
monitor.h_Mutex=OpenMutex(MUTEX_ALL_ACCESSFALSE“mutex_for_ReaderNum“);
DWORD wait_for_mutex; //等待互斥变量所有权
DWORD m_stay; //延迟时间
DWORD m_ThreadStayTime;//读文件持续时间
int m_Threadid;//线程序号
m_Threadid=((ThreadInfo *)(p))->Threadid;
m_stay=(DWORD)(((ThreadInfo *)(p))->ThreadBeginTime*100);
m_ThreadStayTime=(DWORD)(((ThreadInfo *)(p))->ThreadStayTime*100);
Sleep(m_stay); //延迟等待
cout<<“The reader “< wait_for_mutex=WaitForSingleobject(monitor.h_Mutex-1);//等待互斥信号,保证对ReaderNum的访问
ReaderNum++; //读者数目加一
if (ReaderNum==1)
EnterCriticalSection(&monitor.RP_Wr
- 上一篇:清华大学数据结构C语言版习题答案
- 下一篇:在固定分区管理方式下实现主存分配和回收
评论
共有 条评论