2012-04-02 28 views
5

我很難理解第二種算法對讀者寫者問題。我理解一般概念,作家將優先於讀者(讀者可能會餓死)。我甚至可以理解這種算法的條件變量實現Reader/Writer Locks in C++。然而,信號量&互斥體的實現對我來說沒有任何意義。這是維基百科的例子:第二種算法解決讀寫器問題

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 done 

    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); 

[http://en.wikipedia.org/wiki/Readers-writers_problem][2] 

我不明白這三個信號量(互斥3,R和互斥1)是在讀鎖。是不是一個足夠的信號量的計數?

+0

請您發佈一個鏈接到算法或維基百科頁面,以確保我們都在看同一件事? – gbulmer 2012-04-02 10:06:06

回答

8

mutex 1保護readcount變量; mutext 2保護writecount變量;互斥體r保護讀取操作和互斥體w保護寫入操作。

1)讓我們假設一個作家進來:

信號mutex 2和增量writercount佔額外的作家(本身) 因爲它是可以改變writercount唯一的過程(因爲它持有mutex 2)它可以安全地測試它是否是唯一的編寫者(writercount==1),如果爲true,則表示互斥體r用於保護讀者不進入 - 其他編寫者(writercount > 1)可以享受已經發送信號的互斥體r

然後,寫入器發出互斥信號w的信號來保護其與其他(併發)寫入器的更改。

最後一位作家(writecount==1)發佈互斥體r讓讀者執行其任務。

2)我們假設讀者進來:

信號mutex 3以保護讀者的安裝邏輯從其他讀者;然後向互斥器r發出信號以保護其免受其他寫入器的影響(請記住,在寫入器運行時r會發出信號);然後發信號mutex 1來保護(可能正在退出的其他讀取器)的讀數(如果它是第一讀取器(readercount == 1),則信號互斥器w以防止寫入器(現在排除寫器執行其操作)。

閱讀可以並行完成,所以從其他讀者在閱讀(記住,互斥w正在舉行了這一點,所以沒有從作家intereference)

不需要保護,那麼最後一個讀者復位寫互斥(w)允許作家。


防止作家飢餓的技巧是,作家自居的讀者(信令互斥p時),所以有越來越安排,即使有很多讀者一個很好的機會。另外,mutex 3可以防止太多的讀者等待互斥體r,因此作者在來信時很有可能發出r的信號。

+0

感謝Attila的解釋。寫入部分非常有意義,但讀取的部分對我而言仍不清楚。也許爲了更好地理解這一點,你可以解釋如果沒有互斥量3和互斥量1信號量(只有r信號量來保護讀取計數)會發生什麼? – ayl 2012-04-02 11:16:12

+3

Readcount受'mutex 1'保護。 'mutex 3'用於限制等待'r'的併發閱讀器的數量爲1(以防止作家餓死)。 'r'用於協調讀寫器之間的訪問 – Attila 2012-04-02 12:19:55

+1

互斥量3是最棘手的部分。但很好解釋! – Garfield 2013-03-11 02:10:15