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); //写文件
//释放互斥信号
发布评论