?
?1
讀者:
?2
???????
while
?(
true
)?
{
?3
???????P(mutex);
?4
???????????readcount?
++
;
?5
???????????
if
?(readcount
==
1
)
?6
???????????????P?(w);
?7
???????V(mutex);
?8
??????????讀
?9
???????P(mutex);
10
???????????readcount?
--
;
11
???????????
if
?(readcount
==
0
)
12
???????????????V(w);
13
????????V(mutex);
14
????????}
;
15
1
寫者:
2
??????
while
?(
true
)?
{
3
4
???????P(w);
5
?????????寫
6
???????V(w);
7
8
????????}
;
9
?????? 由于沒聽課,對于讀者寫者問題看了好久總覺得不對,之前一直以為,P,V操作簡單的理解為自減自加就可以了,? 若是這樣就有一大堆問題, 當一個讀者A"讀"完(執(zhí)行完第8行),? 另一個讀者B執(zhí)行到第4或5行時,? 此時mutex=0.? 然后這時讀者B執(zhí)行第10行,mutex=-1,B進入等待狀態(tài).? 當B"讀"完(執(zhí)行完第8行),假設恰巧讀者C重蹈覆轍執(zhí)行到第4或5行,結果很嚴重,B接著也陷入死等狀態(tài).?? 還有讀寫之間,同樣出現(xiàn)死等狀態(tài).
? 最后看到信號量操作的函數(shù)WaitForSingleObject的應用:WaitForSingleObject(g_hReadSemaphore,INFINITE)和WaitForSingleObject(g_hWriterSemaphore,INFINITE);這時才明白:
???? mutex和w只有兩種狀態(tài):信號態(tài)和非信號態(tài),不要用自減自加去理解(雖然ReleaseSemaphore(g_hReadSemaphore,1,NULL)的確就是自加實現(xiàn)V原語操作的,但WaitForSingleObject并不能夠一直自減下去),處于非信號態(tài),一直等待,一直檢測,直到恢復信號態(tài)方可退出原語操作.
??? W:實現(xiàn)讀寫互斥,寫寫互斥.
??? mutex:實現(xiàn)讀讀部分時候互斥,第一對PV(mutex)表示在一個讀者申請到資源并進行初始化(readcount++)之前,另一個讀者不可以進來;第二對PV(mutex)表示一個讀者在釋放資源并進行善后(readcount--)時,另一個讀者不可以進來.否則,readcount就變成了臨界資源,其自加自減賦值就會亂套.
另外,關于讀者寫者問題的源碼實現(xiàn),
posted on 2006-11-07 22:15
哈哈 閱讀(4857)
評論(1) 編輯 收藏 引用