1. 程式人生 > >(轉)生產消費者模型

(轉)生產消費者模型

在平時的程式設計中,經常遇到一個執行緒要產生資料,而另一個執行緒要處理產生出來的資料,這其實就是生產者和消費者的關係。生產者在產生資料後可以直接呼叫消費者處理資料;也可以把資料放在一個緩衝區中,讓消費者從緩衝區中取出資料處理,兩種方式從呼叫方式上來說,第一種可是說是同步的,即生產者在生產出資料後要等待消費者消耗掉後才能生產下一個資料,等待時間的長短取決於消費者處理資料的能力;第二種方式是非同步的,生產者只管生產資料,然後扔到一個緩衝區內,不管資料是否被立即處理了,消費者則從緩衝區中依次取出資料進行自己節奏的處理。從執行緒模型角度來說,第一種是單執行緒的,而第二種則是多執行緒的。多執行緒必須要考慮的一個問題是執行緒之間的協作,協作即協調合作,不要亂套,以生產者和消費者模型而言,就是當緩衝區裡沒有資料時消費者要等待,等待生產者生產資料,當緩衝區滿的時候生產者要等待,等待消費者消耗掉一些資料空出位置好存放資料

    java
中為了實現多執行緒之間的協助,需要用到幾個特性:wait(),notify(),notifyAll(),synchronizedsynchronized相當於作業系統裡的臨界區或者鎖的概念,所謂臨界區就是說一次只能有一個執行緒進去,其他想進入的執行緒必須等待,加了synchronized鎖後,才能呼叫wait(),notify()和notifyAll()操作,wait方法被呼叫後,當前執行緒A(舉例)進入被加鎖物件的執行緒休息室,然後釋放鎖,等待被喚醒。釋放的鎖誰來獲取?當然是由先前等待的另一個執行緒B得到,B在獲得鎖後,進行某種操作後通過notify或者notifyAll
A從執行緒休息室喚醒,然後釋放鎖
A被喚醒後,重新獲取鎖定,進行下一語句的執行。再回到生產者和消費者模型,如果引入了緩衝區的話就需要處理生產者執行緒和消費者執行緒之間的協作,緩衝區可以有這幾種,佇列緩衝區,比如佇列或者棧,佇列緩衝區的特點是其長度是動態增長的,這就意味著記憶體的動態分配帶來的效能開銷,同時佇列緩衝區還會產生因為多執行緒之間的同步和互斥帶來的開銷環形緩衝區可以解決記憶體分配帶來開銷的問題,因為環形緩衝區長度是固定的。但是環形緩衝區還是無法解決同步互斥帶來的多執行緒切換的開銷,如果生產者和消費者都不止一個執行緒,帶來的開銷更大,終極解決辦法是引入雙緩衝區,何為雙緩衝區?雙緩衝區顧名思義是有兩個長度固定的緩衝區A B
,生產者和消費者只使用其中一個,當兩個緩衝區都操作完成後完成一次切換,開始時生產者開始向A裡寫資料,消費者從B裡讀取資料,當A寫滿同時B也讀完後,切換一下,這時消費者從A裡取資料,生產者向B寫資料,由於生產者和消費者不會同時操作同一個緩衝區,所以不會發生衝突。生產者和消費者模型不止是用在多執行緒之間,不同程序之間也可以有。執行緒和程序到底有什麼區別?這是很多程式設計師搞不清的問題,其實很簡單,程序有自己的地址空間和上下文,執行緒是在一個程序上併發執行的程式碼段。其實在win32系統中程序只是佔用一定長度的地址空間,程序中總是有一個主執行緒來執行。消費者和生產者模型應用於程序間通訊的典型例子是分散式訊息處理,訊息的消費者程序需要一個緩衝區緩衝收到的訊息,訊息的生產者程序也需要一個緩衝區緩衝將要傳送的訊息,這樣可以一定程度上減少因為網路斷開引起的訊息丟失

相關推薦

生產消費者模型

在平時的程式設計中,經常遇到一個執行緒要產生資料,而另一個執行緒要處理產生出來的資料,這其實就是生產者和消費者的關係。生產者在產生資料後可以直接呼叫消費者處理資料;也可以把資料放在一個緩衝區中,讓消費者從緩衝區中取出資料處理,兩種方式從呼叫方式上來說,第一種可是說是同步的,即生產者在生產出資料後要等待消費者消

Java提高——多執行緒生產消費者問題

生產者/消費者問題是個典型的多執行緒問題,類似於hello world對於一門程式語言而言,涉及的物件包括“生產者”、“消費者”、“倉庫”和“產品”。該模型需要注意以下幾點:1、生產者只有在倉庫未滿的時候生產,倉滿則停止生產。2、消費者只有在倉庫有產品的情況下才能消費,空倉則

綜合運用: C++11 多線程下生產者消費者模型詳解

並發 rep 生產 我會 交流 模型 操作 const ref 生產者消費者問題是多線程並發中一個非常經典的問題,相信學過操作系統課程的同學都清楚這個問題的根源。本文將就四種情況分析並介紹生產者和消費者問題,它們分別是:單生產者-單消費者模型,單生產者-多消費者模型,多生產

讀者寫者模型概念&與生產消費者的區別¥讀寫優先順序問題

    1 #include<stdio.h>                                                        2 #include<pthread.h>   3                   4 int book=0;      

決策樹模型組合之隨機森林與GBDT

get 9.png 生成 代碼 margin ast decision 損失函數 固定 版權聲明: 本文由LeftNotEasy發布於http://leftnoteasy.cnblogs.com, 本文可以被全部的轉載或者部分使用,但請註明出處,如果有問題,請

c++對象內存模型【內存布局】

dbd 對象大小 成員函數 .cn eof 註意 .cpp als his 總結:1、按1繼承順序先排布基於每個父類結構。2、該結構包括:基於該父類的虛表、該父類的虛基類表、父類的父類的成員變量、父類的成員變量。3、多重繼承且連續繼承時,虛函數表按繼承順序排布函數與虛函數。

各種圖論模型及其解答

歐拉公式 否則 但是 至少 接下來 分解 聯系 均可 競賽圖 原文轉自Jelline blog http://blog.chinaunix.net/uid-9112803-id-411340.html 摘要: 本文用另一種思路重新組織《圖論及其應用》相關知識。首先,用通俗化

多線程學習-基礎十二生產者消費者模型:wait(),sleep(),notify()實現

都是 exce 生產 runnable 下午 util 庫存 jason 最大 一、多線程模型一:生產者消費者模型 (1)模型圖:(從網上找的圖,清晰明了) (2)生產者消費者模型原理說明:   這個模型核心是圍繞著一個“倉庫”的概念,生產者消費者都是圍繞著:“倉庫”

全面理解Java內存模型(JMM)及volatile關鍵字

java 關鍵字 最新版本 zed 相互 虛擬機 集成 反射機制 寄存器 原文地址: 全面理解Java內存模型(JMM)及volatile關鍵字 關聯文章: 深入理解Java類型信息(Class對象)與反射機制 深入理解Java枚舉類型(enum) 深入理解Java註

通俗理解N-gram語言模型

資料 簡化 事情 自然 自然語言 規模 什麽 發音 給定 N-gram語言模型 考慮一個語音識別系統,假設用戶說了這麽一句話:“I have a gun”,因為發音的相似,該語音識別系統發現如下幾句話都是可能的候選:1、I have a gun. 2、I have a gu

OpenTSDB 生產應用與思考

多個 數據 設計時 兩種 需要 htm base 層級 num 轉自:https://yq.aliyun.com/articles/623275 OpenTSDB 官方介紹 http://opentsdb.net/overview.html 這裏就不翻譯了。

易寶支付Demo,生產中封裝成簡潔的代付接口,不用request如何獲取項目運行時的真實路徑

工作文件夾 自己 png code 代碼 但是 import 其中 image 最近項目在做融360引流,涉及到了易寶支付的代扣和代付。易寶官方給出的demo只能簡單運行,而且都是通過form表單的形式提交,返回XML格式。同時接口代碼都寫在了JSP中看起來不友好。項目在生

再有人問你Java記憶體模型是什麼,就把這篇文章發給他。

原文連結:再有人問你Java記憶體模型是什麼,就把這篇文章發給他。 前幾天,發了一篇文章,介紹了一下JVM記憶體結構、Java記憶體模型以及Java物件模型之間的區別。有很多小夥伴反饋希望可以深入的講解下每個知識點。Java記憶體模型,是這三個知識點當中最晦澀難懂的一個,而且涉及到很多背

[PyTorch]PyTorch中模型的參數初始化的幾種方法

plane alt align frame nor view tps class normal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~本文目錄1. xavier初始化2. kaiming初始化3. 實際使用中看到的初始化3.1 ResN

OSI七層模型與TCP/IP五層模型

  reference:https://www.cnblogs.com/qishui/p/5428938.html         博主是搞是個FPGA的,一直沒有真正的研究過乙太網相關的技術,現在終於能靜下心學習一下,希望

python 全棧開發,Day71(模型層-單表操作)

昨日內容回顧 1. {% include '' %} 2. extend base.html: <html> ..... ..... .....

python 全棧開發,Day70(模板自定義標籤和過濾器,模板繼承 (extend),Django的模型層-ORM簡介)

昨日內容回顧 檢視函式: request物件 request.path 請求路徑 request.GET GET請求資料 QueryDict {} request.POST POST請求資料 Que

迴歸模型中殘差的三種形式

原文:https://baijiahao.baidu.com/s?id=1581878577084855837&wfr=spider&for=pc 殘差分析是迴歸診斷的方向之一。迴歸分析中常用的殘差有三種,分別為普通殘差、標準化殘差和學生化殘差。 1. 普通殘差(residu

R語言︱機器學習模型評價指標+模型出錯的四大原因及如何糾錯

筆者寄語:機器學習中交叉驗證的方式是主要的模型評價方法,交叉驗證中用到了哪些指標呢?交叉驗證將資料分為訓練資料集、測試資料集,然後通過訓練資料集進行訓練,通過測試資料集進行測試,驗證集進行驗證。模型預測

文字深度表示模型——word2vec&doc2vec詞向量模型

  深度學習掀開了機器學習的新篇章,目前深度學習應用於影象和語音已經產生了突破性的研究進展。深度學習一直被人們推崇為一種類似於人腦結構的人工智慧演算法,那為什麼深度學習在語義分析領域仍然沒有實質性的進展呢?   引用三年前一位網友的話來講:   “Steve Renals算了一下icassp錄取文章題目中包含