?
?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"读"完(执行完第8行),? 另一个读者B执行到第4或5行时,? 此时mutex=0.? 然后这时读者B执行第10行,mutex=-1,B进入等待状态.? 当B"读"完(执行完第8行),假设恰巧读者C重蹈覆辙执行到第4或5行,结果很严重,B接着也陷入死等状态.?? 还有读写之间,同样出现死等状态.
? 最后看到信号量操作的函数WaitForSingleObject的应用:WaitForSingleObject(g_hReadSemaphore,INFINITE)和WaitForSingleObject(g_hWriterSemaphore,INFINITE);这时才明白:
???? mutex和w只有两种状态:信号态和非信号态,不要用自减自加去理解(虽然ReleaseSemaphore(g_hReadSemaphore,1,NULL)的确就是自加实现V原语操作的,但WaitForSingleObject并不能够一直自减下去),处于非信号态,一直等待,一直检测,直到恢复信号态方可退出原语操作.
??? W:实现读写互斥,写写互斥.
??? mutex:实现读读部分时候互斥,第一对PV(mutex)表示在一个读者申请到资源并进行初始化(readcount++)之前,另一个读者不可以进来;第二对PV(mutex)表示一个读者在释放资源并进行善后(readcount--)时,另一个读者不可以进来.否则,readcount就变成了临界资源,其自加自减赋值就会乱套.
另外,关于读者写者问题的源码实现,