允許多個程序同時對資料進行讀操作,讀的時候不能寫,寫的時候不能讀,更不能另乙個也在寫。
1)讀者優先:
只要有讀者,就讓它去讀。
分析問題:
我們要實現:
1.寫-寫互斥
2.寫-讀互斥
3.多個讀是允許的。
對於問題1,可以通過乙個互斥訊號量wsem實現。
對於問題2,也可以通過乙個互斥訊號量實現,並且我們注意到寫和讀是兩個函式,所以可以共用wsem實現。
這樣我們的**是:
semaphore wsem=1
void reader()
}void writer()
}
然後對於問題3,對於這個問題,它並不是孤立存在的,他是因為問題2的存在,我們為了解決問題2,間接給讀-讀也搞了個互斥,所以它才是乙個問題,那怎麼解決呢?那就修改讀的**,我們要實現實現寫和讀的互斥,這就必須要在讀的時候,判斷有沒有寫,但是多個讀又得能併發。
這種情況就是1對多互斥,1個寫對多個讀互斥。
可以搞個全域性變數 readcount,記錄有多少個讀,每次一進入reader程式,那就readcount++,所以如果readcount==1,就代表是第乙個程序進入這個reader,那麼我們就需要判斷有沒有write,還是通過down(wsem)實現,而且,中間的read()操作完了,那就需要readcount--,並且馬上判斷readcount==0,假如是的話,那就通知writer,沒有讀了,也就是通過up(wsem)實現。
並且readcount是個共享的全域性變數,多個讀都要操縱它,所以就需要在操縱readcount的時候就需要另乙個互斥訊號量x來保護它。
所以**是:
int readcount=0;
semaphore wsem=1,x=1;
void reader()
}void writer()
}
這裡學到了這種一對多,多之間可以併發的,並且多這一邊優先,怎麼用訊號量和全域性變數來實現。
讀者-寫者問題的讀寫操作限制(僅讀者優先或寫者優先):
寫-寫互斥,即不能有兩個寫者同時進行寫操作。
讀-寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。
讀-讀允許,即可以有乙個或多個讀者在讀。
寫者優先的附加限制:如果乙個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到沒有寫者處於等待狀態後才能開始讀操作。
寫者優先實現思路:
寫者優先與讀者優先類似。不同之處在於一旦乙個寫者到來,它應該盡快對檔案進行寫操作,如果有乙個寫者在等待,則新到來的讀者不允許進行讀操作。
為此應當新增乙個整型變數write_count,用於記錄正在等待的寫者的數目,當write_count=0時,才可以釋放等待的讀者執行緒佇列。
而為了對全域性變數write_count實現互斥,必須增加乙個互斥訊號量y。
而為了實現寫者優先,必須再加乙個訊號量rsem,當有寫者在寫檔案或等待時,讀者必須阻塞。
所以目前這裡的**是:
int readcount=0,writecount=0;
semaphore wsem=1,x=1,rsem=1,y=1;
void reader()
}void writer()
}
但是仔細想還是有個問題,讀者是阻塞在rsem上,啥子意思,假如下面這種情況發生
先來乙個寫者a,寫者a執行完一半的時候,來n個讀者,這n個讀者都被阻塞在rsem這個佇列裡面了,這時候又來了個寫者b,寫者b也被阻塞在rsem裡面,並且寫者b是排在n個讀者後面的!!! 然後寫者a終於寫完了,它釋放了rsem,而又因為訊號量的釋放通常是先來先服務的!!!所以,需要先完成一堆讀者,才輪到寫者b,那這就不是真正意義上的寫者優先了,寫者優先應該是寫者是個天龍人,能插隊,這才叫寫者優先,所以我們需要實現rsem裡面至多只能有乙個讀者在排隊,這咋實現呢?外面再來乙個訊號量z,讀者是個工具人只能先排舔狗隊伍,成為舔狗之王了,才有資格進入備胎隊伍。
也就是讓讀者先堵在z裡面,z裡面的當前者,才能堵在rsem裡面
所以:
int readcount=0,writecount=0;
semaphore wsem=1,x=1,rsem=1,y=1,z=1;
void reader()
}void writer()
}
讀者寫者問題
生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...
讀者寫者問題
問題簡述 讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 1 寫 寫互斥,即不能有兩個寫者同時進行寫操作。2 讀 寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。3 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...
讀者 寫者問題
讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...