2012-06-28 64 views
1

我对读者/作者信号量解决方案的失败感兴趣,作者优先考虑。如何在读者作者解决方案中导致作者优先权失败?

在下面的代码,从维基百科:

READER 
     P(mutex_3); 
     P(r); 
      P(mutex_1); 
      readcount := readcount + 1; 
      if readcount = 1 then P(w); 
      V(mutex_1); 
     V(r); 
     V(mutex_3); 

     reading is performed 

     P(mutex_1); 
     readcount := readcount - 1; 
     if readcount = 0 then V(w); 
     V(mutex_1); 

...有一个二进制信号mutex_3,这限制线程试图去r信号接入的数量,从而使作家有优先权。

我试图删除该互斥体,期待作家饿死,但没有成功。 我用Java编写了一个程序,线程等待两个固定的时间:读写之后和读写期间。我创建了一个编写器进程和8个读取器进程,并为所有人设置等待时间为1毫秒。我试图创造一种情况,其中r信号正在不断受到一位作家和许多读者的攻击。这些都没有引起我期望的失败。

我做错了什么?我怎样才能导致作家饥饿?

+0

您正在做这件事的任何特殊原因?它破坏了读写器锁的整个点。 –

回答

1

在这个问题上 - 从wikipedia -

int readcount, writecount; (initial value = 0) 
semaphore mutex_1, mutex_2, mutex_3, w, r ; (initial value = 1) 

READER 
    P(mutex_3); 
    P(r); 
     P(mutex_1); 
     readcount := readcount + 1; 
     if readcount = 1 then P(w); 
     V(mutex_1); 
    V(r); 
    V(mutex_3); 

    reading is performed 

    P(mutex_1); 
    readcount := readcount - 1; 
    if readcount = 0 then V(w); 
    V(mutex_1); 


WRITER 
    P(mutex_2); 
    writecount := writecount + 1; 
    if writecount = 1 then P(r); 
    V(mutex_2); 

    P(w); 
    writing is performed 
    V(w); 

    P(mutex_2); 
    writecount := writecount - 1; 
    if writecount = 0 then V(r); 
    V(mutex_2); 

这将是很难在实践中饿死的读者,但在理论上,他们可能。

事情是作家优先于读者,所以如果你有作家总是来,读者将永远等待执行。

希望它有帮助!

相关问题