出處:http://dantvt.spaces.live.com
讀者-寫者問題 寫者優先與公平競爭
多程序對共享資源互斥訪問及程序同步的經典問題
設有一檔案f,多個併發讀程序和寫程序都要訪問,要求:
(1)讀寫互斥
(2)寫寫互斥
(3)允許多個讀程序同時訪問
採用記錄型訊號量機制解決
較常見的寫法:
semaphore fmutex=1, rdcntmutex=1;
//fmutex --> access to file; rdcntmutex --> access to readcount
int readcount = 0;
void reader()
}void writer()
}讀程序只要看到有其他讀程序正在訪問檔案,就可以繼續作讀訪問;寫程序必須等待所有讀程序都不訪問時才能寫檔案,即使寫程序可能比一些讀程序更 早提出申請。所以以上解法實際是 讀者優先 的解法。如果在讀訪問非常頻繁的場合,有可能造成寫程序一直無法訪問檔案的局面....
為了解決以上問題,需要提高寫程序的優先順序。這裡另增加乙個排隊訊號量:queue。讀寫程序訪問檔案前都要在此訊號量上排隊,通過區別對待讀寫程序便可達到提高寫程序優先順序的目的。另外再增加乙個 writecount 以記錄提出寫訪問申請和正在寫的程序總數:
semaphore fmutex=1, rdcntmutex=1, wtcntmutex=1, queue=1;
//fmutex --> access to file; rdcntmutex --> access to readcount
//wtcntmutex --> access to writecount
int readcount = 0, writecount = 0;
void reader()
}void writer()
}每個讀程序最開始都要申請一下 queue 訊號量,之後在真正做讀操作前即讓出(使得寫程序可以隨時申請到 queue)。而只有第乙個寫程序需要申請 queue,之後就一直佔著不放了,直到所有寫程序都完成後才讓出。等於只要有寫程序提出申請就禁止讀程序排隊,變相提高了寫程序的優先順序。
通過類似思想即可實現讀寫程序的公平競爭:
semaphore fmutex=1, rdcntmutex=1, queue=1;
//fmutex --> access to file; rdcntmutex --> access to readcount
int readcount = 0;
void reader()
}void writer()
}讀程序沒變,寫程序變成在每次寫操作前都要等待 queue 訊號量。
課本上一般只會寫第一種解法吧。看了後兩種方法即可發現,在第乙個解法中,fmutex 訊號量實際是雙重身份,首先實現對檔案的互斥訪問,其次起到了和後面排隊訊號量 queue 相同的作用,只不過在那種排序下只能是讀者優先。如果直接看過後兩種解法,應該會有更清楚的理解吧。
經典程序同步問題 讀者寫者
讀者 寫者問題 問題描述 有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但是如果某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。簡單來說,你可以乙個文件開啟好多,但是你不能邊讀邊寫。從上述來看,得滿足以下幾個要求。允許多個...
經典程序同步問題 讀者寫者問題
問題描述 有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀...
程序同步 讀者與寫者的問題
writer1 writer2 reader1 count v mutex 讀 p mutex count if count 0 如果是最後乙個讀者,釋放檔案 v mutex reader2 count v mutex 讀 p mutex count if count 0 v mutex 例 橫跨峽...