生產(chǎn)者和消費者模式

這幾天同事在處理RK平臺的基于mipi協(xié)議的數(shù)據(jù)時候泽谨,碰到數(shù)據(jù)透傳到usb到PC端的時候出現(xiàn)問題,因為數(shù)據(jù)量比較大特漩,加上是并發(fā)傳輸吧雹,所以通信上用到了生產(chǎn)者消費者模式。

生產(chǎn)者消費者模式涂身,或者更貼切的說它是一種模型雄卷,不能說屬于一種設(shè)計模式。具體來講蛤售,就是一個系統(tǒng)中存在生產(chǎn)者和消費者兩種角色丁鹉,他們通過內(nèi)存緩沖區(qū)進(jìn)行通信,而如何保證并發(fā)通信悴能,這就是程序員要思考的問題揣钦。比如說國內(nèi)的淘寶,拼多多漠酿,京東等超級流量級別的電子商務(wù)冯凹,用戶訪問瀏覽頁面的時候,圖片資源以及網(wǎng)頁內(nèi)容要在幾秒內(nèi)就刷出來炒嘲,這些就是程序員工程師的智慧的結(jié)晶宇姚,而背后很大程度上生產(chǎn)者與消費者模式用得淋漓盡致。

生產(chǎn)者是一個或者一堆線程夫凸,消費者也是一個或者一堆堆線程浑劳,內(nèi)存緩沖區(qū)可以使用List數(shù)組隊列,數(shù)據(jù)類型只需要定義一個簡單的類寸痢,如何處理多線程之間的協(xié)作通信呀洲。這是一門藝術(shù)性的問題,像我工作中遇到的場景啼止,rk平臺的mipi數(shù)據(jù)總是不斷的吐露出來道逗,而我要能隨時接納數(shù)據(jù)并且不能影響幀率,這就很考驗人献烦。我同事遇到就懵圈了滓窍,不會利用這個模式去解決問題,如果你還在用單線程的操作去設(shè)立數(shù)據(jù)緩存區(qū)巩那,我覺得就有點愚蠢了吏夯。

在這個模型中此蜈,最關(guān)鍵就是內(nèi)存緩沖區(qū)為空的時候消費者必須等待,而內(nèi)存緩沖區(qū)滿的時候噪生,生產(chǎn)者必須等待裆赵。其他時候可以是個動態(tài)平衡。值得注意的是多線程對臨界區(qū)資源的操作時候必須保證在讀寫中只能存在一個線程跺嗽,所以需要設(shè)計鎖的策略战授。

這里要提到的是用intel線程庫tbb的使用,Intel 宣布桨嫁,Threading Building Blocks植兰,Intel 眾多軟件開發(fā)工具中的一個,open source了璃吧。協(xié)議是 GPLv2楣导。我在自己場景中是利用tbb這個庫來創(chuàng)建線程,實現(xiàn)這個生產(chǎn)者與消費者模型畜挨。

tbb創(chuàng)建生產(chǎn)者與消費者并發(fā)線程隊列

生產(chǎn)者隊列

消費者隊列

實際中應(yīng)用

當(dāng)然用tbb直接來創(chuàng)建線程隊列筒繁,你可能無法去領(lǐng)悟它的精髓,所以建議你還是不要以來tbb這個庫朦促,而自己單純的用創(chuàng)建線程的方式手撕這部分代碼膝晾。

這個模型的核心精髓是緩沖區(qū)的設(shè)立栓始。而且你可以采用隊列务冕,管道,sockert或者其他方式去設(shè)計分配這塊內(nèi)存緩沖區(qū)幻赚。當(dāng)數(shù)據(jù)制造快的時候禀忆,消費者來不及處理,未處理的數(shù)據(jù)可以暫時存在緩沖區(qū)中落恼。等生產(chǎn)者的制造速度慢下來箩退,消費者再慢慢處理掉。

當(dāng)然它支持并發(fā)的同時也帶來一個弊端佳谦。由于函數(shù)調(diào)用是同步的(或者叫阻塞的)戴涝,在消費者的方法沒有返回之前,生產(chǎn)者只好一直等在那邊钻蔑。萬一消費者處理數(shù)據(jù)很慢啥刻,生產(chǎn)者就會白白糟蹋大好時光。因為RK平臺咪笑,全志813平臺可帽,聯(lián)發(fā)科平臺這些SOC芯片處理器吐出的數(shù)據(jù)是非常快的窗怒,如果你不設(shè)立緩沖區(qū)映跟,或者不去設(shè)計這么一塊區(qū)域去處理數(shù)據(jù)蓄拣,或者基于ISP算法處理,那么你肯定會影響到幀率速度努隙,甚至于芯片的性能無法完美的詮釋球恤。

使用了生產(chǎn)者/消費者模式之后,生產(chǎn)者和消費者可以是兩個獨立的并發(fā)主體荸镊。生產(chǎn)者把制造出來的數(shù)據(jù)往緩沖區(qū)一丟碎捺,就可以再去生產(chǎn)下一個數(shù)據(jù)〈蓿基本上不用依賴消費者的處理速度收厨。這個模式是不在GOF提出的23種設(shè)計模式之中的,它不是基于面向?qū)ο蟮脑O(shè)計模式优构,而是面向過程的一個設(shè)計模式诵叁,所以經(jīng)常被廣泛用于系統(tǒng)性的架構(gòu)當(dāng)中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钦椭,一起剝皮案震驚了整個濱河市拧额,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彪腔,老刑警劉巖侥锦,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異德挣,居然都是意外死亡肖油,警方通過查閱死者的電腦和手機叫胁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筋遭,你說我怎么就攤上這事雀摘∈涤蓿” “怎么了纬傲?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贴铜。 經(jīng)常有香客問我粪摘,道長,這世上最難降的妖魔是什么绍坝? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任徘意,我火速辦了婚禮,結(jié)果婚禮上陷嘴,老公的妹妹穿的比我還像新娘映砖。我一直安慰自己,他們只是感情好灾挨,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布邑退。 她就那樣靜靜地躺著竹宋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪地技。 梳的紋絲不亂的頭發(fā)上蜈七,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音莫矗,去河邊找鬼飒硅。 笑死,一個胖子當(dāng)著我的面吹牛作谚,可吹牛的內(nèi)容都是我干的三娩。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼妹懒,長吁一口氣:“原來是場噩夢啊……” “哼雀监!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眨唬,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤会前,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匾竿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓦宜,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年岭妖,在試婚紗的時候發(fā)現(xiàn)自己被綠了临庇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡区转,死狀恐怖苔巨,靈堂內(nèi)的尸體忽然破棺而出版扩,到底是詐尸還是另有隱情废离,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布礁芦,位于F島的核電站蜻韭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柿扣。R本人自食惡果不足惜肖方,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望未状。 院中可真熱鬧俯画,春花似錦、人聲如沸司草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猜憎,卻和暖如春娩怎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胰柑。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工截亦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柬讨。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓崩瓤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踩官。 傳聞我的和親對象是個殘疾皇子谷遂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容