2024年4月29日发(作者:)

操作系统实习报告

日期:

实习题目: 读者写者问题

实习

内容

简要

描述

主要

代码

结构

(附

释)

姓名:陈明明 组号: 学号

创建一个控制台进程。此进程包含n个线程。用这n个线

程来表示n个读者或写者。每个线程按相应测试数据文件

(后面有介绍)的要求进行读写操作。用信号量机制分别实

现读者优先和写者优先的读者-写者问题

#include "stdafx.h"

#include"windows.h"

#include

#include

#include

#include

#include

#include

#define READER 'R' //读者

#define WRITER 'W' //写者

#define INTE_PER_SEC 1000 //每秒时钟中断数目

#define MAX_THREAD_NUM 64 //最大线程数目

//#define MAX_FILE_NUM 32 //最大数据文件数目

//#define MAX_STR_LEN 32 //字符串长度

int readcount=0; //读者数目

int writecount=0; //写者数目

//int r_i = 1;

//int w_j = 1;

CRITICAL_SECTION RP_Write; //临界区

CRITICAL_SECTION CS_Write;

CRITICAL_SECTION CS_Read;

{

int serial; //线程序号

char entity; //线程类别(判断是读者线程还是写者线程)

double delay; //线程延迟

double persist; //线程读写操作持续时间

};

void RP_ReaderThread(void * p) //---------------------------读者优先--读者线程

{

HANDLE h_Mutex; //互斥变量

//--临界区写

//--临界区读

struct ThreadInfo//------------------------------定义线程的结构

//OpenMutex函数功能:为现有的一个已命名互斥体对象创建一个新句柄

DWORD wait_for_mutex; //等待互斥变量所有权

h_Mutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readcount");

DWORD m_delay; //延迟时间

DWORD m_persist; //读文件持续时间

int m_serial; //线程序号

//从参数中获得信息

m_serial = ((ThreadInfo *)(p)) -> serial;

m_delay = (DWORD)(((ThreadInfo *)(p)) -> delay * INTE_PER_SEC);

后发出对共享资源的读(写)申请。

printf("Reader thread %d sents the reading require.n",m_serial);

wait_for_mutex = WaitForSingleObject(h_Mutex,-1);

readcount++;

}

//释放互斥信号

printf("Reader thread %d begins to read file.n",m_serial); //读文件

//读者数目增加

//第一个读者,等待资源

if(readcount == 1){

EnterCriticalSection(& RP_Write);

m_persist =

(DWORD)(((ThreadInfo *)(p)) -> persist * INTE_PER_SEC); Sleep(m_delay); //延迟等待,然

ReleaseMutex(h_Mutex);

Sleep(m_persist);

printf("Reader thread %d finished reading file.n",m_serial); //退出线程

wait_for_mutex = WaitForSingleObject(h_Mutex,-1);

readcount--;//读者数目减少

if(readcount == 0){

LeaveCriticalSection(& RP_Write);

}

ReleaseMutex(h_Mutex);

}

void RP_WriterThread(void * p) //--------------------------读者优先--写者线程

{

DWORD m_delay; //延迟时间

DWORD m_persist; //写文件持续时间

int m_serial; //线程序号

m_serial = ((ThreadInfo *)(p)) -> serial; //从参数中获得信息

m_delay = (DWORD)(((ThreadInfo *)(p)) -> delay * INTE_PER_SEC);

m_persist = (DWORD)(((ThreadInfo *)(p)) -> persist * INTE_PER_SEC);

Sleep(m_delay); //延迟等待

//等待资源

printf("Writer thread %d sents the writing require.n",m_serial);

EnterCriticalSection(& RP_Write);

Sleep(m_persist);

printf("Writer thread %d finishing writing to the file.n",m_serial);

}

LeaveCriticalSection(& RP_Write); //释放资源

//退出线程

printf("Writer thread %d begins to write to the file.n",m_serial); //写文件

//释放互斥信号