读者写着问题的伪代码
//读者优先:1.用db同步信号量控制读者与写着同步访问数据
// 2.用mutex互斥信号量控制读者的数目
// 3.r_rc表示读者的数目
db=1,mutex=1,r_rc=0;
void reader()
{
while(true)//读者优先且允许有多个读者
{
wait(&mutex); //申请控制读者数目的权利
r_rc = r_rc +1; //读者数目增加一个
if(r_rc =1) wait(&db); //1.如果读者数目已经有一个了,便可申请访问数据的权利,
同时阻塞写着进程
2.如果读者数目不止一个,则可以直接进行读操作,因为读
者优先
signal(&mutex); //释放控制读者数目的权利
read_date(); //进行读操作
wait(&mutex); //申请控制读者数目的权利
r_rc = r_rc -1; //读者数目减少一个
if(r_rc =0) signal(&db);//1.如果读者数目一个都没有,则释放访问数据的权利,同时唤
醒写着进程
2.如果读者数目仍旧还有,则继续进行读者进程
signal(&mutex); //释放控制读者数目的权利
}
}
void writer()
{
while(true)//允许有多个写着进行等待
{
wait(&db); //等待读者进程的唤醒或者说是申请访问数据的权利
write_date(); //进行写操作
signal(&db); //唤醒读者进程或者释放访问数据的权利
}
}
//写着优先
// 1.同步信号量db实现读与写进程的同步
// 2.互斥信号量mutex1实现控制写者的人数
// 3.w_rc表示写者的人数
w_rc=1, db=1,mutex1=1
void writer()
{
while(true)
{
wait(&mutex1); //申请控制写者人数的权利
w_rc=w_rc+1; //写者人数增加一个
if(w_rc=1) wait(&db); //1.如果写者数目已经有一个了,便可申请访问数据的
权利,同时阻塞读者进程
//2.如果写者数目不止一个,则可以直接进行写操作,
因为写者优先
signal(&mutex1); //释放控制写者人数的权利
write_date(); //进行写操作
wait(&mutex1); //申请控制写者人数的权利
w_rc=w_rc-1; //释放控制写者人数的权利
if(w_rc=0) signal(&db); //1.如果写者数目一个都没有,则释放访问数据的权利,
同时唤醒读者进程
//2.如果写者数目仍旧还有,则继续进行写者进程
signal(&mutex1); 释放控制写者人数的权利
}
}
void reader()
{
while(true)
{
wait(&db); //等待写者进程的唤醒或者说是申请访问数据的权利
read_data(); //进行读操作
signal(&db); //唤醒写者进程或者释放访问数据的权利
}
}
大家帮忙给我看看,这是自己总结的两种读者写者问题的情况,哪里有不对的地方吗?