多程序讀寫乙個緩衝區的機制

2021-04-12 14:18:21 字數 1174 閱讀 3282

今天主管給安排了乙個工作,實現多程序對乙個緩衝區的對操作,做流**的,需要高效率的機制。經過一天的思考,確定了乙個比較好的機制。

把緩衝區設定成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...