进程控制_读者写者问题

//信号量结构体
struct semaphore
{
	int count;//消耗资源
	PCB* queue;//等待在信号量上的进程
};
//信号量的两种操作
P(semaphore &s)
{
	s.count--;
	if(s.count<0)
	{
		//1、阻塞该进程;
		//2、将该进程插入等待队列s.queue;
	}
}
V(semaphore &s)
{
	s.count++;
	if(s.count<=0)//value=0,生产资源前value=-1,有阻塞的进程
	{
		//1、唤醒进程,
		//即等待队列s.queue中取出第一个进程P插入就绪队列
	}
}

//读者优先
semaphore mutex = 1;//对数据区的互斥访问
semaphore rmutex = 1;//对readcount的互斥访问
int readcount = 0;//记录读者数量
writer()
{
	while(true)
	{
		P(mutex);
		write();
		V(mutex);
	}
}
reader()
{
	while(true)
	{
		P(rmutex);//readcount使用权的互斥访问
		if(readcount == 0) P(mutex);//第一个进入的读者,要阻止写者进入
		readcount++;
		V(rmutex);
		read();
		P(rmutex);
		readcount--;
		if(readcount == 0) V(mutex);//没有读者了,允许写者进入
		V(rmutex);
	}
}
//写者优先
semaphore mutex = 1;//互斥访问数据区
semaphore rmutex = 1;//读者互斥访问readcount
semaphore wmutex = 1;//写者互斥访问writecount
semaphore readable = 1;//用于实现写者插队,设置的一个等待位 
reader()
{
	while(true)
	{
		P(readable);//检查是否有写者进程,没有则占用,即阻塞等待位
		P(rmutex);//阻塞读者
		if(readcount == 0) P(mutex);//阻塞写者
		readcount++;
		V(rmutex);//唤醒读者
		V(readable);//唤醒等待位
		read();
		P(rmutex);//阻塞读者
		readcount--;
		if(readcount == 0) V(mutex);//唤醒写者
		V(rmutex);//唤醒读者
	}
}
writer()
{
	while(true)
	{
		P(wmutex);
		if(writecount == 0) P(readable);//第一个写者,阻止读者进入
		writecount++;
		V(wmutex);
		P(mutex);//互斥访问数据区
		write;
		V(mutex);
		P(wmutex);
		writecount--;
		if(writecount == 0) V(readable);
		V(wmutex);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值