1
						 读者:
				
				
						读者:
						 2
						
								 
								 while
						 (
						true
						)
       
						while
						 (
						true
						) 
						
								 {
						
				
				
						
								{
								 3
						
						
								
										 P(mutex);
       P(mutex);
								 4
								
										 readcount 
								++
						
						
								;
           readcount 
								++
						
						
								;
								 5
								
										 if
								 (readcount
								==
								1
						
						
								)
           
								if
								 (readcount
								==
								1
						
						
								)
								 6
						
						
								
										 P (w);
               P (w);
								 7
						
						
								
										 V(mutex);
       V(mutex);
								 8
						
						
								
										 读
          读
								 9
						
						
								
										 P(mutex);
       P(mutex);
								10
								
										 readcount 
								--
						
						
								;
           readcount 
								--
						
						
								;
								11
								
										 if
								 (readcount
								==
								0
						
						
								)
           
								if
								 (readcount
								==
								0
						
						
								)
								12
						
						
								
										 V(w);
               V(w);
								13
						
						
								
										 V(mutex);
        V(mutex);
								14
								
										 }
						
				
				
						;
        }
						
				
				
						;
						15
						
								 
						
				
		 
		
				
						1
						 写者:
				
				
						写者:
						2
						
								 
								 while
						 (
						true
						)
      
						while
						 (
						true
						) 
						
								 {
						
				
				
						
								{
								3
						
						
								
										 
										
								
								4
						
						
								
										 P(w);
       P(w);
								5
						
						
								
										 写
         写
								6
						
						
								
										 V(w);
       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就变成了临界资源,其自加自减赋值就会乱套.
		
		
		另外,关于读者写者问题的源码实现, 
	posted on 2006-11-07 22:15 
哈哈 阅读(4879) 
评论(1)  编辑 收藏 引用