• 大小: 8KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-25
  • 语言: C/C++
  • 标签:

资源简介

读者-写者问题的读写操作要求: 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

评论

共有 条评论

相关资源