今天主管給安排了乙個工作,實現多程序對乙個緩衝區的對操作,做流**的,需要高效率的機制。經過一天的思考,確定了乙個比較好的機制。
把緩衝區設定成1、
2兩區,讀程序(多個)去讀
1區,同時寫程序(多個)要向
2區寫,這樣可以提高一倍的吞吐量。現在問題是當讀程序發現
1區沒有了內容,怎麼通知寫程序切換到
1區寫,以方便讀程序去
2區讀。
解決辦法:設定乙個
flag
標誌為,
1代表讀程序在
1區讀操作,
2表示讀程序在
2區。設定四個訊號燈,0、
1分別指示讀程序在1、
2區的個數(當然也可以用乙個來表示,因為讀程序在同乙個時間只能在乙個區操作),2、
3代表寫程序在1、
2區的個數。
具體描述:假設一開始
flag = 2.
讀程序在
2區,寫程序在
1區(當緩衝區滿了,把老資料覆蓋),當有讀程序進入
2區時,都要進行v(
0)操作,來表示現在有多少個程序在讀操作(當然讀的時候,要對對應的臨界區互斥,即索引值,稍微多說一下,由於每次操作都是很大的資料,所以需要一定時間,但是修改索引值的時間很短,所以可以多個程序在讀寫操作,可以看一下生產者
-消費者),當讀程序操作完成後,進行p(
0)操作。大家相安無事。
當又來乙個讀操作,發現
2區已經沒有資料可讀,立即把
flag=4(
若一開始
flag=1
,則把flag =3),
然後去檢視
1區是否有寫程序,若有,則阻塞。直到
1區沒有寫程序。第乙個進入
1區的程序把
flag置為1
。 當來了乙個寫程序,檢視
flag=4,
知道讀程序原來在
2區操作,而現在
2區已經沒有資料可讀,所以它要去
2區寫資料,當然要先檢視
2區是否還有讀程序在操作,有則阻塞。直到
2區沒有讀程序。
上面的機制建立在程序不能出現異常,也就是說操作一定完成的前提下,假設有讀程序在
2區出現問題,一直不進行
v(0)
操作,則寫程序是無法進入的。
by rainfish
多程序讀寫乙個緩衝區的機制
多程序讀寫乙個緩衝區的機制 今天主管給安排了乙個工作,實現多程序對乙個緩衝區的對操作,做流 的,需要高效率的機制。經過一天的思考,確定了乙個比較好的機制。把緩衝區設定成1 2兩區,讀程序 多個 去讀1區,同時寫程序 多個 要向2區寫,這樣可以提高一倍的吞吐量。現在問題是當讀程序發現1區沒有了內容,怎...
兩棧共用乙個緩衝區
年 月 日 兩個棧共用乙個緩衝區 儲存格式 base2 top2 top1 base1 include include include include typedef int element t 兩個棧的資料結構 typedef struct tag stack t stack t 初始化,分配記憶...
如何實現乙個迴圈緩衝區模型
下面是乙個ringbuffer模型的完整實現,歡迎讀者參考和指正 typedef unsigned char byte template class ringbuffer ringbuffer ringbuffer const ringbuffer copy m poppos 0 else m pu...