【經典同步問題總結】
阿新 • • 發佈:2018-11-21
一、讀者,寫者問題
(1)當寫者在執行寫操作時,不允許其他寫者和讀者操作共享變數
(2)允許多個讀者同時進行操作
解法一:讀者優先
存在的問題:如果有一個讀者執行緒在讀,那麼之後如果同時來了讀執行緒和寫執行緒,讀執行緒會優先執行
可能會導致寫執行緒長時間等待。
1 int count=0; //用於記錄當前的讀者數量 2 semaphore mutex=1; //用於保護更新count變數時的互斥 3 semaphore rw=1; //用於保證讀者和寫者互斥地訪問檔案 4 5 // 寫者執行緒 6 writer () { 7 while (1){ 8P(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 }