※ 引述《wsx02 ()》之銘言:
: http://www.lib.tku.edu.tw/service/exampdf/master/96master/9660088.pdf
: 第五題
: 請問有人知道這題怎麼解嗎?
解得不太確定 參考看看就好
(a)
R1正在讀時 R2,W1,R3 依序到
R2到時 writing = 0 , 也沒有writer要準備寫
不符合 if(writing || !empty(OK_to_write) 不會卡在OK_to_read.wait
=> R1,R2 可以讀
W1到時 read_cnt!=0 (R1,R2正在讀) , writing = 0 (沒有人在寫入)
符合 if(read_cnt!=0 || writing) 所以會卡在OK_to_write.wait
=> W1卡在外面
R3到時 writing = 0 , 但有W1準備寫入
符合 if(writing || !empty(OK_to_write) R3卡在OK_to_read.wait
=>R3卡在外面
R1,R2讀完之後 會執行 OK_to_write.signal 讓W1進去寫
W1正在寫時 W2,R4,W3依序抵達 => R3和W2,R4,W3會都被卡在外面
W1寫完時 因為有R3,R4 符合 if(!empty(OK_to_read))
然後執行OK_to_read讓R3讀 , 但R4會因為有W2,W3準備寫入而卡在外面
R3讀完後會執行OK_to_write.signal讓W2進去寫
W2正在寫時 R5,W4依序到達 => R5,W4被卡在外面
W2寫完時 因為有R4,R5 符合 if(!empty(OK_to_read))
然後執行OK_to_read讓R4讀 , 但R5會因為有W3,W4準備寫入而卡在外面
R4讀完後會執行OK_to_write.signal讓W3進去寫
W3寫完 因為有R5 符合 if(!empty(OK_to_read))
然後執行OK_to_read讓R5讀
R5讀完後會執行OK_to_write.signal讓W4進去寫
故執行順序為:R1,R2,W1,R3,W2,R4,W3,R5,W4 其中R1和R2可以同時讀
(b)
Reader可以進入讀取的條件變成:"只有有人在寫入時時才要卡在外面"
R1正在讀時 R2,W1,R3 依序到
R2,R3都可進入讀取 , W1卡在外面
R1,R2,R3都讀取完後 ,W1開始寫
W1正在寫時 W2,R4,W3依序抵達 => W2,R4,W3都被卡在外面
W1寫完時 因為有R4 符合 if(!empty(OK_to_read))
然後執行OK_to_read讓R4讀
R4讀完後會執行OK_to_write.signal讓W2進去寫
W2正在寫時 R5,W4依序到達 => R5,W4被卡在外面
W2寫完時 因為有R5 符合 if(!empty(OK_to_read))
然後執行OK_to_read讓R5讀
R5讀完後會執行OK_to_write.signal讓W3進去寫
W3寫完此時已沒reader 則執行else OK_to_write.signal
讓W4進去寫
故執行順序為:R1,R2,R3,W1,R4,W2,R5,W3,W4
有錯誤麻煩更正 感謝~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.47.219.125
※ 編輯: seiki 來自: 114.47.219.125 (03/14 00:00)