#include "windows.h"
#include <conio.h>
#include <stdlib.h>
#include <fstream>
#include <io.h>
#include <string.h>
#include <stdio.h>
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; //线程读写操作时间
};
// 读者优先---读者线程
void RP_ReaderThread(void* p)//p:读者线程信息
{
//互斥变量
HANDLE h_Mutex;
h_Mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "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);
//等待互斥信号,保证对ReadCount 的访问,修改互斥
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);
//等待互斥信号,保证对ReadCount的访问,修改互斥
wait_for_mutex = WaitForSingleObject(h_Mutex, -1);
//读者数目减少
readcount--;
if (readcount == 0)
{
//如果所有的读者读完,唤醒写者
LeaveCriticalSection(&RP_Write);
}
ReleaseMutex(h_Mutex); //释放互斥信号
}
// 读者优先--写者线程
void RP_WriterThread(void* p)//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)//file:文件名
{
DWORD n_thread = 0; //线程数目
DWORD thread_ID; //线程ID
DWORD wait_for_all; //等待所有线程结束
//互斥对象
HANDLE h_Mutex;
h_Mutex = CreateMutex(NULL, FALSE, "mutex_for_readcount");
//线程对象的数组
HANDLE h_Thread[MAX_THREAD_NUM];
ThreadInfo thread_info[MAX_THREAD_NUM];
readcount = 0; //初始化readcount
InitializeCriticalSection(&RP_Write); //初始化临界区
ifstream inFile;
inFile.open(file);
printf("读者优先:\n\n");
while (inFile)
{
//读入每一个读者,写者的信息
inFile >> thread_info[n_thread].serial;
inFile >> thread_info[n_thread].entity;
inFile >> thread_info[n_thread].delay;
inFile >> thread_info[n_thread++].persist;
inFile.get();
}
for (int i = 0; i < (int)(n_thread); i++)
{
if (thread_info[i].entity == READER || thread_info[i].entity == 'R')
{
//创建读者进程
h_Thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(RP_ReaderThread), &thread_info[i], 0, &thread_ID);
}
else
{
//创建写线程
h_Thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(RP_WriterThread), &thread_info[i], 0, &thread_ID);
}
}
//等待所有的线程结束
wait_for_all = WaitForMultipleObjects(n_thread, h_Thread, TRUE, -1);
printf("所有读者写者均完成操作。\n");
}
//写者优先---读者线程
void WP_ReaderThread(void* p)//p:读者线程信息
{
//互斥变量
HANDLE h_Mutex1;
h_Mutex1 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex1");
HANDLE h_Mutex2;
h_Mutex2 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex2");
DWORD wait_for_mutex1; //等待互斥变量所有权
DWORD wait_for_mutex2;
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);
//阻塞互斥对象mutex1
wait_for_mutex1 = WaitForSingleObject(h_Mutex1, -1);
//读者进入临界区
EnterCriticalSection(&cs_Read);
//阻塞互斥对象Mutex2,保证对readCount的访问和修改互斥
wait_for_mutex2 = WaitForSingleObject(h_Mutex2, -1);
//修改读者的数目
readcount++;
if (readcount == 1)
{
// 如果是第1个读者,等待写者写完
EnterCriticalSection(&cs_Write);
}
ReleaseMutex(h_Mutex2);// 释放互斥信号 Mutex2
//让其他读者进入临界区
LeaveCriticalSection(&cs_Read);
ReleaseMutex(h_Mutex1);
//读文件
printf("读者线程<%d>开始读文件。\n", m_serial);
Sleep(m_persist);
//退出线程
printf("读者线程<%d>读文件结束。\n", m_serial);
//阻塞互斥对象Mutex2,保证对readcount的访问,修改互斥
wait_for_mutex2 = WaitForSingleObject(h_Mutex2, -1);
readcount--;
if (readcount == 0)
{
//最后一个读者,唤醒写者
LeaveCriticalSection(&cs_Write);
}
ReleaseMutex(h_Mutex2); //释放互斥信号
}
//写者优先---写者线程
void WP_WriterThread(void* p)//p:写者线程信息
{
DWORD wait_for_mutex3; //互斥变量
DWORD m_delay; //延迟时间
DWORD m_persist; //读文件持续时间
int m_serial; //线程序号
HANDLE h_Mutex3;
h_Mutex3 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex3");
//从参数中获得信息
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);
// 阻塞互斥对象mutex3, 保证对writecount的访问、修改互斥
wait_for_mutex3 = WaitForSingleObject(h_Mutex3, -1);
writecount++; //修改写者数目
if (writecount == 1)
{
// 第一个写者,等待读者读完
EnterCriticalSection(&cs_Read);
}
ReleaseMutex(h_Mutex3);
// 进入写者临界区
EnterCriticalSection(&cs_Write);
// 写文件
printf("写者线程<%d>开始写文件。\n", m_serial);
Sleep(m_persist);
// 退出线程
printf("写者线程<%d>写文件结束。\n", m_serial);
// 离开临界区
LeaveCriticalSection(&cs_Write);
// 阻塞互斥对象mutex3,保证对writecount的访问、修改互斥
wait_for_mutex3 = WaitForSingleObject(h_Mutex3, -1);
writecount--;
if (writecount == 0)
{
// 写者写完,读者可以读
LeaveCriticalSection(&cs_Read);
}
ReleaseMutex(h_Mutex3);
}
//写者优先处理函数
void WriterPriority(char* file)// file:文件名
{
DWORD n_thread = 0;// 线程数目
DWORD thread_ID;// 线程ID
DWORD wait_for_all;// 等待所有线程结束
// 互斥对象
HANDLE h_Mutex1;
h_Mutex1 = CreateMutex(NULL, FALSE, "mutex1");
HANDLE h_Mutex2;
h_Mutex2 = CreateMutex(NULL, FALSE, "mutex2");
HANDLE h_Mutex3;
h_Mutex3 = CreateMutex(NULL, FALSE, "mutex3");
// 线程对象
没有合适的资源?快使用搜索试试~ 我知道了~
rw.zip_cardbep_writingixd_读者写者
共23个文件
tlog:6个
pdb:2个
filters:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 174 浏览量
2022-09-22
14:19:43
上传
评论
收藏 26.92MB ZIP 举报
温馨提示
创建一个控制台进程。此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制(包括读者优先和写者优先): 1)写-写互斥,即不能有两个写者同时进行写操作。 2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。 3)读-读允许,即可以有一个或多个读者在读。
资源推荐
资源详情
资源评论
收起资源包目录
rw.zip (23个子文件)
rw
.vs
rw
v16
Browse.VC.db 35.49MB
.suo 35KB
ipch
AutoPCH
7dae147aaf89e0c
RW.ipch 69.31MB
rw.sln 1KB
rw.vcxproj.filters 1KB
rw.vcxproj 6KB
rw.vcxproj.user 168B
rw.cpp 10KB
thread.dat 45B
Debug
rw.obj 307KB
rw.pdb 1.1MB
vc142.pdb 492KB
rw.tlog
CL.write.1.tlog 332B
CL.read.1.tlog 39KB
CL.command.1.tlog 550B
rw.lastbuildstate 204B
link.write.1.tlog 332B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
rw.ilk 1.28MB
rw.exe 117KB
vc142.idb 355KB
rw.log 80B
共 23 条
- 1
资源评论
御道御小黑
- 粉丝: 61
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功