资源简介
windows操作系统内核实验。读者写者问题。创建一个控制台进程。此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。
代码片段和文件信息
//OS_EXP1_ReadAndWrite
//操作系统实验一:读者写者问题
//ReadAndWrite.cpp
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#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; //写者数目
CRITICAL_SECTION RP_Write; //临界区
CRITICAL_SECTION CS_Write; //临界区写
CRITICAL_SECTION CS_Read; //临界区读
struct ThreadInfo{
int serial ; //线程序号
char entity; //线程类别(判断线程是读者还是写者)
double delay; //线程延迟
double persist; //线程读写操作持续时间
};
////////////////////////////////////////////////////////////////////////////////////
//读者优先-----读者线程
//p:读者线程信息
void RP_ReaderThread(void *p){
//互斥变量
HANDLE h_Mutex; //互斥变量
//OpenMutex函数功能:为现有的一个已命名互斥体对象创建一个新句柄
h_Mutex = OpenMutex(MUTEX_ALL_ACCESSFALSE“mutex_for_readcount“);
DWORD wait_for_mutex; //等待互斥变量所有权
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(“读者线程 %d 申请读文件操作.\n“m_serial);
wait_for_mutex = WaitForSingleobject(h_Mutex-1);
readcount++; //读者数目增加
if(readcount == 1){
EnterCriticalSection(& RP_Write); //第一个读者等待资源
}
ReleaseMutex(h_Mutex); //释放互斥信号
printf(“读者线程 %d 开始读文件.\n“m_serial); //读文件
Sleep(m_persist);
printf(“读者线程 %d 读文件完毕.\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(“写者线程 %d 申请写文件操作.\n“m_serial);
EnterCriticalSection(& RP_Write); //等待资源
printf(“写者线程 %d 开始写文件.\n“m_serial); //写文件
Sleep(m_persist);
printf(“写者线程 %d 写文件完毕.\n“m_serial); //退出线程
LeaveCriticalSection(& RP_Write); //释放资源
}
void ReaderPriority(char * file) //-------------------------读者优先处理函数-
{
DWORD n_thread = 0; //线程数目
DWORD thread_ID; //线程ID
DWORD wait_for_all; //等待所有线程结束
HANDLE h_Mutex; //互斥对象
h_Mutex = CreateMutex(NULLFALSE“mutex_for_readcount“);
HANDLE h_Thread[MAX_THREAD_NUM]; //线程对象的数组
ThreadInfo thread_info[MAX_THR
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 45 2012-10-07 21:31 thread.dat
文件 9674 2012-10-28 23:51 ReadAndWrite.cpp
- 上一篇:操作系统实验报告_读者写者问题.doc
- 下一篇:截图并让图片显示最前面
评论
共有 条评论