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