资源简介
1 实验目标
能够编写程序模拟读者 写者问题
2 实验要求
在Windows2000环境下 创建一个控制台进程 此进程包含n个线程 用这n个线程来表示n个读者或写者 每个线程按相应测试数据文件 后面有介绍 的要求进行读写操作 用信号量机制分别实现读者优先和写者优先的读者 写者问题
读者 写者问题的读写操作限制 包括读者优先和写者优先 :
1 写 写互斥 即不能有两个写者同时进行写操作
2 读 写互斥 即不能同时有一个线程在读 而另一个线程在写
3 读 读允许 即可以有一个或多个读者在读
读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作 则该读者可直接开始读操作
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源 则该读者必须等到没有写者处于等待状态后才能开始读操作
运行结果显示要求:要求在每个线程创建 发出读写操作申请 开始读写操作和结束读写操作时分别显示一行提示信息 以确定所有处理都遵守相应的读写操作限制 ">1 实验目标
能够编写程序模拟读者 写者问题
2 实验要求
在Windows2000环境下 创建一个控制台进程 此进程包含n个线程 用这n个线程来表示n个读者或写者 每个线程按相应测试数据文件 后面有介绍 的要求进行读写操 [更多]
代码片段和文件信息
#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;
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;
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 (“Reader thread %d sents the reading require.\n“m_serial);
wait_for_mutex=WaitForSingleobject(h_Mutex-1);
readcount++;
if(readcount==1)
{
EnterCriticalSection(&RP_Write);
}
ReleaseMutex(h_Mutex);
printf(“Reader thread %d begins to read file.\n“m_serial);
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);
}
//////////////////////////////////////////////////////////////////////////
//读者优先--写者线程
//p:写者线程信息
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);
printf(“Writer thread %d begins to write the file.\n“m_serial);
Sleep(m_persist);
printf(“Writer thread %d finishing writing to the file.\n“m_serial);
LeaveCriticalSection(&RP_Write);
}
/////////////////////////////////////////////////////////////////
//读者优先处理函数
//file:文件名
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_THREAD_NUM];
readcount=0;
InitializeCriticalSection(&RP_Write);
ifstream inFile;
inFile.open(file);
printf(“Reader Priority:\n\n“);
while(inFile)//读人每一个读者、写者的信息
{
inFile>>thread_info[n_thread].serial;
inFile>>thread_info[n_thread].entity;
inFile>>t
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 43 2013-10-16 17:05 thread.dat
文件 8394 2013-10-16 17:20 读者写者问题.cpp
文件 137728 2014-02-12 00:23 实验报告.doc
- 上一篇:大学数据结构期末考试试题(有答案)
- 下一篇:ios上传照片、拍照上传demo
评论
共有 条评论