读者写者问题|操作系统

动机:共享数据的访问
两种类型使用者:
读者:不需要修改数据
写者:读取和修改数据

问题的约束
允许同一时间有多个读者,但在任何时候只有一个写者
当没有写者是读者才能访问数据
当没有读者和写者时,写者才能访问数据
在任何时候只有一个线程能操作共享变量

多个并发进程的数据集共享

Rcount:有多少个读者
WriteMutex:写保护

读者优先(信号量的方式)

sem_wait(WriteMutex);

	write;

sem_post(WriteMutex);

sem_wait(CountMutex);
if(Rcount==0)
	sem_wait(WriteMutex);
++Rcount;
sem_post(CountMutex);

read;

sem_wait(CountMutex);
--Rcount;
if(Rcount==0)
	sem_post(WirteMutex)
sem_post(CountMutex)

写者优先(管程方式)

Database::Read()
{
	wait until no writers;
	read database;
	check out - wakr up waiting writers;
}

Database::Write()
{
	wait until no readers/writers;
	write database;
	check out - wake up waiting readers/writers;
	
}

AR = 0;//Active Readers
AW = 0;//Active Writers
WR = 0;//Wait Readers
WW = 0;//Wait Writers

Condition okToRead;
Condition okToWrite;
Lock lock;
Private Database::StartRead()
{
	lock.Acquire();
	while((AW+WW)>0)
	{
		WR++;
		okToRead.wait(&lock);
		WR--;
	}
	AR++;
	lock.Release;
}

Private Database::DoneRead()
{
	lock.Acquire();
		AR--;
		if(AR==0&&WW>0)
		{
			okToWrite.signal();
		}
	lock.Release();
	}
}	

Private Database::StartWrite()
{
lock.Acquire()
	while((AW+AR)>0)
	{
		WW++;
		okToWrite.wait(&lock);
		WW--;
	}
	AW++;
lock.Release();
}

Private Database::DoneWrite()
{
lock.Acquire();
	AW--;
	if(WW>0)
	{
		okToWrite.signal();
	}
	else if(WR>0)
	{okToRead.brodcast();
	}
lock.Release();
}

Public Database::Write()
{
	StartWrite();
	write databse;
	DoneWrite();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值