1. 程式人生 > >【經典同步問題總結】

【經典同步問題總結】

一、讀者,寫者問題

(1)當寫者在執行寫操作時,不允許其他寫者和讀者操作共享變數

(2)允許多個讀者同時進行操作

解法一:讀者優先

存在的問題:如果有一個讀者執行緒在讀,那麼之後如果同時來了讀執行緒和寫執行緒,讀執行緒會優先執行

      可能會導致寫執行緒長時間等待。

 1 int count=0; //用於記錄當前的讀者數量
 2 semaphore mutex=1; //用於保護更新count變數時的互斥
 3 semaphore rw=1; //用於保證讀者和寫者互斥地訪問檔案
 4  
 5 // 寫者執行緒
 6 writer () { 
 7     while (1){
 8
P(rw); // 互斥訪問共享變數 9 Writing; // 寫操作 10 V(rw) ; // 釋放對共享變數的佔有 11 } 12 } 13 14 // 讀者執行緒 15 reader () { 16 while(1){ 17 P(mutex) ; //互斥訪問count變數 18 if(count==0) //當第一個讀程序讀共享檔案時 19 P(rw); //阻止寫程序寫 20 count++; //讀者計數器加1 21 V(mutex); //
釋放互斥變數count 22 23 reading; //讀操作 24 25 P(mutex); //互斥訪問count變數 26 count--; //讀者計數器減1 27 if(count==0) //當最後一個讀程序讀完共享檔案 28 V(rw); //允許寫程序寫 29 V(mutex); //釋放互斥變數 count 30 } 31 }

解法二:寫者優先

 1 int count = 0; //用於記錄當前的讀者數量
2 semaphore mutex = 1; //用於保護更新count變數時的互斥 3 semaphore rw=1; //用於保證讀者和寫者互斥地訪問檔案 4 semaphore w=1; //用於實現“寫優先” 5 6 writer(){ 7 while(1){ 8 P(w); //在無寫程序請求時進入 9 P(rw); 10 writing; 11 V(rw); 12 V(w); //恢復對共享支件的訪問 13 } 14 } 15 reader(){ 16 while(1){ 17 P(w); // 在無寫程序請求時進入 18 P(mutex); 19 if(count==0) 20 P(rw); 21 count++; 22 V(mutex); 23 V(w); // 恢復對共享檔案的訪問 24 25 reading; 26 27 P(mutex); 28 count--; 29 if(count==0) 30 V(rw); 31 V(mutex); 32 } 33 }