“读者—写者”问题

“读者—写者”问题记录型信号量

一个数据文件或记录可被多个进程共享。

  • 只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。
  • 允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象

“读者—写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。

读者—写者问题要解决:读、读共享;写、写互斥;写、读互斥。

①定义互斥信号量wmutex,实现写、写互斥和写、读互斥。

②定义整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程写,因此仅当Readcount=0,即无Reader进程在读时,Reader才需要执行Wait(wmutex)操作。若Wait(wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。同理,仅当Reader进程在执行了Readcount减1操作后其值为0时,才需执行signal(wmutex)操作,以便让Write进程写。

③由于Readcount为多个读进程共享(修改),因此需要以互斥方式访问,为此,需要定义互斥信号量rmutex,保证读进程间互斥访问Readcount。

semaphore wmutex = 1;
semaphore rmutex = 1;
int readcount = 0;// 记录有几个读者
void reader()
{while(true){wait(rmutex); // rmutex是为了保护readcount共享变量if(readcount == 0){wait(wmutex);// 保证第一个读进程来,写进程就不能进行}readcount++;signal(rmutex);// 读的过程wait(rmutex);readcount--;if(readcount == 0){signal(wmutex); // 保证最后一个读进程读完,释放wmutex信号量}signal(rmutex);}
}
void writer()
{while(true){wait(wmutex);// 写的过程signal(wmutex);}
}

“读者—写者”问题信号量集式信号量

增加一个限制:最多只允许RN个读者同时读。

引入信号量L,并赋予其初值RN,通过执行Swait(L, 1, 1)操作,来控制读者的数目。

每当有一个读者进入时,就要先执行Swait(L, 1, 1)操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN +1个读者要进入读时,必然会因Swait(L, 1, 1)操作失败而阻塞。

semaphore mx = 1;// 作为读写互斥的信号量
int L = 0;// 记录有几个读者
const int RN = 1000;
void reader()
{while(true){swait(L,1,1);swait(mx,1,0); //一个开关,当mx>1时,才能读// readsignal(L,1);}
}
void writer()
{while(true){swait(mx,1,1;L,RN,0); // 当mx-1成功,并且L>=RN的时候才可以进行,此时说明没有读进程在读// 写的过程signal(mx,1);}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部