读者-作者(读者饥饿)

readers-writers ( readers starvation )

维基百科上说"adds the constraint that no thread shall be allowed to starve"下面的代码,我不明白为什么没有饥饿。 例如:如果有很多作者在 reader 之前到达并且第一个作者花了很长时间完成他的写作,那么 r 可能会达到一些大的负数让我们说 -12345 然后在它之后 readers 开始与 writer 一起到达,并且操作系统总是选择 writer 来获取信号量而不是 reader,在这种情况下 readers 会饿死,是对还是我错了? link : readers-writers problem

看link中的第三个readers-writers问题。

代码:

int readcount; // (initial value = 0)
semaphore mutex_rdcnt, r, w; // ( initial value = 1 ) 
//READER
    wait(r);
      wait(mutex_rdcnt);
        readcount++;
        if (readcount == 1)
          wait(w);
      signal(mutex_rdcnt);          
    signal(r);

    // reading is performed 

    wait(mutex_rdcnt);
      readcount--;
      if (readcount == 0)
        signal(w);
    signal(mutex_rdcnt);  
//WRITER
    wait(r);
    wait(w);

     // writing is performed

    signal(w);  
    signal(r);

发现问题: 请注意,此解决方案只能满足条件 "no thread shall be allowed to starve" 当且仅当信号量在阻塞和释放线程时保持先进先出顺序。 否则,例如,一个被阻塞的写入器可能会无限期地保持阻塞状态,而其他写入器的循环会先于信号量递减。