读者-写者问题及其中存在的饥饿分析

读者写者问题是互斥问题的一个概括,一组并发的线程要访问一个共享变量,例如主存中的数据结构,或者一个磁盘上的数据库。有些线程只读对象,而其他的线程只修改对象,修改对象的线程就是写者,而读的线程就是读者。

读写问题有几个变种,但都是基于不同的优先级考虑,现以第一类读者-写者问题说明饥饿现象。

int readcnt=0;
semaphore mutex=1,W=1;

reader()
{
  while(1)
 {
    P(mutex);
    raedcnt++;
    if(readcnt==1)
      p(W);
    v(mutex);

   p(mutex);
   readcnt--;
   if(readcnt==0)
     v(W);
   v(mutex);
 }
}

writer()
{
  while(1)
  {
    p(W);
    writer;
     V(W);
  }
}

饥饿就是一个线程无限期的阻塞,无法进展。

上图的代码如果有读者不断的到来,写者就可能无限的等待。该算法给予了读者较高的优先级,但是从某种意义上来说,该种优先级是很弱的,因为一个离开临界区的写者可能重启一个等待的写者,而不是一个在等待的读者。想象一个场景:一群写者使一个读者饥饿。

考虑下面一个问题:

读者-写者问题及其中存在的饥饿分析_第1张图片

分析:该题在设置turn为0,P0等待进入临界区时,将turn设置为-1,故P1进程也可以进入,所以不满足互斥条件。本题类似上篇博客的双标志法后检查,所以会产生饥饿。

你可能感兴趣的:(操作系统,读者写者算法,饥饿)