亚洲国产成人,色呦呦内射午夜,无码一级片,无码人妻少妇色欲AV一区二区

<samp id="jg8hh"></samp>

<p id="jg8hh"></p><delect id="jg8hh"><em id="jg8hh"><blockquote id="jg8hh"></blockquote></em></delect><acronym id="jg8hh"><dd id="jg8hh"></dd></acronym><button id="jg8hh"><dd id="jg8hh"><acronym id="jg8hh"></acronym></dd></button><samp id="jg8hh"><em id="jg8hh"><blockquote id="jg8hh"></blockquote></em></samp>

<p id="jg8hh"></p>

<samp id="jg8hh"><legend id="jg8hh"></legend></samp>
<samp id="jg8hh"><legend id="jg8hh"><samp id="jg8hh"></samp></legend></samp>

<samp id="jg8hh"></samp>

<p id="jg8hh"></p><acronym id="jg8hh"></acronym><p id="jg8hh"><dd id="jg8hh"><acronym id="jg8hh"></acronym></dd></p><p id="jg8hh"></p>

<p id="jg8hh"></p><delect id="jg8hh"><legend id="jg8hh"><var id="jg8hh"></var></legend></delect><button id="jg8hh"><listing id="jg8hh"><i id="jg8hh"></i></listing></button>
<delect id="jg8hh"><legend id="jg8hh"><var id="jg8hh"></var></legend></delect>

環(huán)形緩沖區(qū)中的緩沖區(qū)類型有(環(huán)形緩沖區(qū)是一種)

發(fā)布時間:2023-11-10
本文主要介紹環(huán)形緩沖區(qū)中有緩沖區(qū)類型(環(huán)形緩沖區(qū)是一種類型),下面一起看看環(huán)形緩沖區(qū)中有緩沖區(qū)類型(環(huán)形緩沖區(qū)是一種類型)相關資訊。
首先,生產者-消費者模型
生產者-消費者模式是解決多個模塊間數(shù)據(jù)通信問題的有效機制。通過在數(shù)據(jù)生產者和數(shù)據(jù)消費者之間設置數(shù)據(jù)緩沖區(qū),實現(xiàn)了低耦合度的數(shù)據(jù)通信。
圖1生產者/消費者模式的結構
這樣的結構就像流水線上的兩道工序,以及它們之間的一個架子。前道工序有一批工人,他們會把這道工序的產品上架,然后馬上回到自己的生產工作中;同樣,后一道工序的若干工人可以直接從貨架上領取前一道工序的產品,直接開始自己的生產工作。
與直接調用數(shù)據(jù)通信模式相比,生產者/消費者模式有一個額外的數(shù)據(jù)緩沖區(qū),但它的優(yōu)勢也非常明顯:
1.支持模塊并發(fā)
使用直接調用通信最明顯的缺點是調用關系被阻塞,調用者必須中斷自己的任務,等待被調用者返回后才能繼續(xù)執(zhí)行,大大降低了程序的效率。尤其是當被調用的模塊涉及到網(wǎng)絡通信、文件讀寫等耗時的操作時,如果主音一直阻塞等待,將是一種無法接受的性能損失。使用生產者/消費者模式,生產者模塊(即原音函數(shù))只需要將數(shù)據(jù)放入緩沖區(qū),本周期的任務完成,就可以立即返回執(zhí)行下一周期的任務。類似地,消費者模塊(對應于最初被調用的函數(shù))并不 不必等到最后一個進程結束,只要數(shù)據(jù)緩沖區(qū)不為空,就可以立即開始消費操作。
2.支持忙閑不均。
在很多業(yè)務場景中,數(shù)據(jù)生產者的生產速度和數(shù)據(jù)消費者的消費速度可能在一定范圍內波動。如果使用直接呼叫,無論主叫方或被叫方是否忙,雙方都必須減速以協(xié)調數(shù)據(jù)同步的速度。但是,如果一方通過數(shù)據(jù)緩沖區(qū)進入繁忙狀態(tài),它可以使用緩沖區(qū)中的數(shù)據(jù)或空間進行調整(如果消費者的處理速度變慢,生產者不必減速,生成的數(shù)據(jù)可以使用緩沖區(qū)的剩余部分進行存儲)。
也可以對應流水線的例子。如果前道工序的工人上廁所,如果直接交接產品,那么后道工序的工人就要暫時停工。而如果雙方通過貨架交接,貨架上的產品就足夠前道工序的工人在前道工序的工人離開的這段時間操作。
3.降低耦合度
如果使用直撥,如果以后雙方的編碼發(fā)生變化(比如收發(fā)數(shù)據(jù)的頻率,數(shù)據(jù)單元的大小),雙方的編碼都需要變化。在生產者/消費者模式中,如果一方 的數(shù)據(jù)訪問方法發(fā)生變化時,他只需要使用緩沖區(qū)的一部分。
對應于流量以水線為例,如果下一道工序上來一個新人,這個新人有自己的工作節(jié)奏,習慣一次拿兩塊,那么上一道工序的人就得改變節(jié)奏,給隔壁送兩塊;如果雙方通過貨架交接,無論隔壁的人有什么工作習慣,都可以按照自己的想法從貨架上拿走任何零件,前道工序的生產節(jié)奏不需要調整。
二、環(huán)形緩沖區(qū)結構
圖2環(huán)形緩沖區(qū)的結構
循環(huán)緩沖區(qū)使用兩個指針分別用于讀寫,兩者旋轉方向相同,就像兩個人在操場上互相競爭。在讀指針前面,寫指針后面,這部分被劃分成數(shù)據(jù)塊,這部分的狀態(tài)是可讀和未寫;而寫指針在讀指針的前面和后面,這部分被劃分成空閑塊,這部分塊的狀態(tài)是可寫和不可讀。當寫指針追上讀指針時,緩沖區(qū)已滿,寫指針需要暫停寫入;當讀指針追上寫指針時,緩沖區(qū)為空,讀指針需要暫停讀取。
與普通的隊列結構(fifo)相比,環(huán)形緩沖區(qū)的所有讀寫操作都是在相對固定的存儲區(qū)域內完成的,這樣如果程序涉及到頻繁的讀寫,就可以節(jié)省大量的空間應用釋放操作。
三、生產者-消費者模式下環(huán)形緩沖區(qū)的應用(代碼實現(xiàn))
以下代碼是在linux環(huán)境下編譯運行的,其他環(huán)境可能略有不同。
# include stdio . h # include stdlib . h # include unistd . h # include semaphore . h # include pthread . h # define size 10int product _ idx = 0;//生產者指針int consume _ idx = 0;//消費者指針int data = 0;int ring[size];//環(huán)形緩沖區(qū)sem _ t blanksem//控制空閑塊的信號量sem _ t datasem//控制數(shù)據(jù)塊的信號量pthread _ mutex _ t product _ lock = pthread _ mutex _ initializer;//互斥鎖pthread _ mutex _ t consume _ lock = pthread _ mutex _ initializer;//互斥鎖定消費者中的pthread _ tproduct _ 1 _ tid、product _ 2 _ tid、consume _ 1 _ tid、consume _ 2 _ tidvoid* product_1(void *arg) //生產者線程1{ while(1) {pthread_mutex_lock(product _ lock);//搶占生產者互斥鎖sem _ wait(blank sem);//獲取一個空閑的塊資源環(huán)[product _ idx]= data;sem _ post(datasem);//釋放一個數(shù)據(jù)塊資源printf( product _ 1 putdata : % d \ n ,環(huán)[product _ idx]);product _ idx = product _ idx % size//環(huán)形緩沖區(qū)pthread _ mutex _ unlock(product _ lock)的地址方法;//釋放生產者互斥鎖sleep(1);}返回null}void* product_2(void *arg) //生產者線程2 { while(1){ pthread _ mutex _ lock(product _ lock);sem _ wait(blank sem);ring[product _ idx]= data;s: % d \ n ,環(huán)[product _ idx]);product _ idx = product _ idx % sizepthread _ mutex _ unlock(product _ lock);睡眠(1);}返回null}void* consume_1(void *arg) //消費者線程1 { int consume _ data = 0;while(1){ pthread _ mutex _ lock(consume _ lock);//搶占消費者互斥體sem _ wait(datasem);//獲取一個數(shù)據(jù)塊資源consume _ data = ring[consume _ idx];sem _ post(blank sem);//釋放一個自由塊資源printf( consume _ 1 get data : % d \ n ,consume _ data);睡眠(1);consume _ idxconsume _ idx = consume _ idx % size//環(huán)形緩沖區(qū)的地址方法pthread _ mutex _ unlock(consume _ lock);//釋放消費者互斥睡眠(2);}返回null}void* consume_2(void *arg) //消費者線程2 { int consume _ data = 0;while(1){ pthread _ mutex _ lock(consume _ lock);sem _ wait(datasem);consume _ data = ring[consum: % d \ n ,consume _ data);睡眠(1);consume _ idxconsume _ idx = consume _ idx % sizepthread _ mutex _ unlock(consume _ lock);睡眠(2);}返回null}int main{ sem_init(blanksem,0,size);//初始化信號量sem_init(datasem,0,0);int ret = 0;ret = pthread _ create(product _ 1 _ tid,null,(void *) product_1,null);//創(chuàng)建線程if(ret){ printf( pthread _ createproduct _ 1錯誤);退出(0);} ret = pthread _ create(product _ 2 _ tid,null,(void *) product_2,null);if(ret){ printf( pthread_create product_2錯誤);退出(0);} ret = pthread _ create(consume _ 1 _ tid,null,(void *) consume_1,null);if(ret){ printf( pthread_create consume_1錯誤);退出(0);} ret = pthread _ create(consume _ 2 _ tid,null,(void *) consume_2,null);if(ret){ printf( pthread_create consume_2錯誤);退出(0);} pthread_join(product_1_tid,null);//讓主線程等待每個子線程完成pthread _ join (product _ 2 _ tid,null);pthread_join(consume_1_tid,null);pthread_join(consume_2_tid,null);sem _ destroy(blank sem);//銷毀信號量sem _ destroy(datasem);}
代碼編譯運行后,運行效果如下圖所示:
圖3演示程序的運行效果
可以看出,生產者產生的數(shù)總是大于消費者取走的數(shù),而且不會比消費者取走的數(shù)大10,這說明生產者 s指針既不能被消費者超越,也不能被消費者圍剿。
四、定速生產者模式下的設計思路
生產者/消費者模型中一個很重要的原則是,需要時刻監(jiān)控緩沖區(qū)的狀態(tài),當緩沖區(qū)滿了,生產者就應該停止生產操作;當緩沖區(qū)為空時,應該停止使用方。
但在實際開發(fā)中,可能會出現(xiàn)生產者或消費者處于固定速度的狀態(tài)(比如生產者是一個數(shù)據(jù)采集模塊,他采集的很多數(shù)據(jù)都需要消費)。在這種情況下,流水線的例子似乎并不適用。我們可以用一個新的混凝土模型:天花板漏水。
天花板以固定的速度向地板漏水,地上放一個小水桶。偶爾有住戶從臥室出來倒水。在這里,漏水的天花板充當生產者,住戶是消費者,這個小水桶就是他們之間的緩沖器。在這種情況下,生產者以固定的速度連續(xù)產生數(shù)據(jù),即使緩沖區(qū)滿了,他也不會停滴。這種情況下如何保護緩沖區(qū)不溢出?我的想法是在緩沖器上再加一個緩沖器,就是在水桶下面再放一個盆。在實際開發(fā)中,采用的是讀寫文件的,在緩沖區(qū)滿了的情況下寫入文件。在這種情況下,消費者策略也應該更改為在緩沖區(qū)不為空時讀取緩沖區(qū),在緩沖區(qū)為空時讀取文件。
在代碼層面,可以考慮用sem_trywait(sem_t *sem _ t * sem)代替sem_wait(sem_t*sem)。當sem_wait想要獲取的資源量為0時,線程會一直阻塞在這里,等待其他線程釋放資源,而sem _ wait不會等待。當資源量為0時,繼續(xù)向下執(zhí)行,通過返回值判斷是否成功獲取資源。如果成功獲取,則返回0,信號量減1。無法獲取-1,信號量未更改。
通過這種,我們可以對上述文章中的生產者和消費者代碼進行以下更改:void* product(void *arg) //生產者線程{ while(1){ pthread _ mutex _ lock(product _ lock);//抓住生產者互斥鎖if (sem _ try (blanksem)!= 0) //非阻塞嘗試獲取空閑塊資源{/*此處添加寫文件代碼*/} else //獲取成功{ ring[product _ idx]= data;sem _ post(datasem);//釋放一個數(shù)據(jù)塊資源printf( product _ 1 putdata : % d \ n ,環(huán)[product _ idx]);product _ idx = product _ idx % size} pthread _ mutex _ unlock(product _ lock);//釋放生產者互斥鎖sleep(1);}返回null}void* consume(void *arg) //消費者線程{ int consume _ data = 0;while(1){ pthread _ mutex _ lock(consume _ lock);//搶占消費者互斥if (sem _ trywaite (datasem)!= 0) //非阻塞嘗試獲取一個數(shù)據(jù)塊資源{/*這里是補充讀取文件代碼*/} else //獲取成功{ consume _ data = ring[consume _ idx];sem _ post(blank sem);//釋放一個自由塊資源printf( consume _ 1 get data : % d \ n ,consume _ data);睡眠(1);consume _ idxconsume _ idx = consume _ idx % size} pthread _ mutex _ unlock(consume _ lock);//釋放消費者互斥睡眠(2);}返回null}
標簽:
緩沖生產者
了解更多環(huán)形緩沖區(qū)中有緩沖區(qū)類型(環(huán)形緩沖區(qū)是一種類型)相關內容請關注本站點。
上一個:flyme怎么清理內存,魅族手機系統(tǒng)占很多內存怎么清理
下一個:excel表格添加說明文字(excel在指定單元格添加文字)

明基投影儀如何無線連接電腦(明基投影儀怎么聯(lián)網(wǎng))
組裝機和品牌機哪個好(買品牌組裝機還是自己組裝)
norgren英國制造的接頭產品(讓您的工程設備更加穩(wěn)定可靠)
常用剖削導線絕緣層的方法
華碩筆記本性價比排名第幾,華碩辦公筆記本哪個系列性價比高
山茶花扦插繁殖要點
ugreen(綠聯(lián))cm448usb無線網(wǎng)卡電腦隨身wifi接收器ac650m
汽車照明與信號系統(tǒng)的基本組成
stm32f303r8t6中文資料pdf
適合游戲的筆記本電腦品牌(主流游戲筆記本推薦)