用记录型信号量解决读者-写者问题

该博客是关于操作系统读者写者问题的总结。此问题指多个进程共享数据文件,允许多个读进程同时访问,但写进程需与其他进程互斥访问,以避免混乱。还采用记录型信号量用类C语言描述了算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于操作系统读者写者问题的个人总结

问题描述是一个数据文件或记录可被多个进程共享,把只要求读该文件的进程称为“Reader进程”,其他进程称为“Writer进程”。允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象,因为会引起混乱,
也就是保证一个Writer进程必须与其他进程互斥的访问共享对象的同步问题。

采用记录型信号量来大概描述整个算法

以下为类C语言:

semaphore rmutex=1,wmutex=1;   //wmutex用于实现Reader和Writer在读或写时的互斥,rmutex是让多个reader进程互斥的访问readcount资源
int readcount=0;  //readcount表示正在读的进程数目
读者程序:
void reader(){
	do{
		wait(rmutex);  //对readcount进行互斥访问
		if(readcount==0) wait(wmutex); //如果是第一个读者进行读过程,判断是否有写过程在临界区,如果有,写进程等待,如果没,阻塞写进程进入临界区
		readcount++; //读进程可以实现,所以readcount提前++
		signal(rmutex); //结束对readcount的互斥访问
		-----
		perform read operation;
		----
		wait(rmutex); //读进程实现完毕后需要对readcount--,所以依然互斥访问raedcount
		readcount--;
		if(readcount==0) signal(wmutex);  //判断最后一个离开临界区的读进程走时是否有写进程在临界区,如果有唤醒一个写进程进入临界区
		signal(rmutex);
	}while(true)
}

写者程序
void writer(){
	do{
		wait(wmutex);
		perform wirte operation
		signal(wmutex);
	}while(true);
}//  写进程很简单,没什么需要注意的
初始条件: 1操作系统:Linux 或者 windows 2程序设计语言:C,java语言 3设有20个连续的存储单元,入/读出的数据项按增序设定为1-20这20个字符。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰等具体要求) 1.技术要求: 1)为每个读者者产生一个线程,设计正确的同步算法 2)每个读者/者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/者线程的自定义标识符。。 3)读者应有3个以上,者应有有两个以上。 4)多个读者/者之间须共享对存储区进行操作的函数代码。 2. 设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机IP地址和目录。) 5)运行结果与运行情况 (提示: (1)连续存储区可用数组实现。 (2)编译命令可用:     cc -lpthread -o  目标文件名  源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1) 调试记录 2) 自我评析和总结 上机时间安排: 19周一 ~ 五 下午14:00 - 18:00 (6月27日开始) 指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日 五、源代码 #include #include #include "fstream.h" int readcount=0; //读者数目 int writecount=0; //者数目 CRITICAL_SECTION RP_Write; //临界区 CRITICAL_SECTION cs_Write; CRITICAL_SECTION cs_Read; struct ThreadInfo //线程信息 { int Threadhao; //线程序号 char ThreadClass; //线程类别 double ThreadStartTime; //线程开始时间 double ThreadRunTime; //线程读持续时间 }; void ReaderFun(char* file);//读者优先函数 void R_ReaderThread(void *p);//处理读者优先读者线程 void R_WriterThread(void *p);//处理读者优先者线程 void WriterFun(char* file); void W_ReaderThread(void *p); void W_WriterThread(void *p); int main()//主函数 { char select; while (true) { cout<<"***************本程序实现读者-问题*******\n"<<endl; cout<<" 1:读者优先"<<endl; cout<<" 2:者优先"<<endl; cout<<" 3:退出"<<endl; cout<<"\n*********************************************"<<endl; cout<<"选择要进行的操作:"<>select; if(select!='1' && select!='2' && select!='3') cout<<"你操作有误,重试!"<<endl; }while (select!='1' && select!='2' && select!='3'); system("cls"); if (select=='3') return 0;//退出 else if (select=='1')//调用读者优先 ReaderFun("peizhi.txt"); else if(select=='2')//调用者优先 WriterFun("peizhi.txt"); cout<<"\n是否还有继续? 1. 继续 2.退出"<>select; if(select!='1' && select!='2' ) cout<<"你操作有误,重试!"<<endl; }while (select!='1' && select!='2'); if(select=='2') return 0;// 退出 system("cls"); } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值