2012-06-28 103 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); 

這將是很難在實踐中餓死的讀者,但在理論上,他們可能。

事情是作家優先於讀者,所以如果你有作家總是來,讀者將永遠等待執行。

希望它有幫助!

相關問題