资源简介

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

评论

共有 条评论