在我們介紹今天的內容之前我們先了解一些相關的概念
linux執行緒基本概念
linux執行緒控制
linux執行緒互斥
linux執行緒同步
接下來我們進入今天的主題生產者消費者模型
生產者消費者模型概念
為什麼要使用生產者消費者模型
生產消費者模型的優點
基於阻塞佇列的生產者消費者模型
生產者消費者模型實現**
#ifndef __cp__hpp__
#define __cp__hpp__
#include #include #include #include #include #include using namespace std;
class blockqueue
void unlockqueue()
bool queueisfull()
bool queueisempty()
void signalconsumer()
void consumerwait()
void signalproduct()
void productwait()
public:
blockqueue(int cap_ = 32):cap(cap_)//佇列初始化
//生產者生產資料
void pushdata(const int& in)
//佇列不為滿則生產者可以生產product
q.push(in);//將資料寫進佇列
signalconsumer();//一旦有資料就喚醒消費者消費
unlockqueue();
}//消費者消費資料
void popdata(int& out)
//佇列不為空,消費者可以消費
//consumer
out = q.front();//將佇列頭部資料儲存下來
q.pop();//刪除該資料
signalproduct();//一旦有空間就通知生產者生產
unlockqueue();
}//析構函式,清理資源
~blockqueue()
};#endif
#include #include "cp.hpp"
void *consumer(void *arg)//arg中存放的是我們建立的阻塞佇列的首位址
}void *product(void *arg)
}int main()
cp:cp.cc
g++ -o $@ $^ -lpthread
.phony:clean
clean:
rm -f cp
Linux 基於阻塞佇列的生產消費者模型
談生產者消費者模型之前我們必須知道什麼是生產者消費者模型,看題目你可能覺得他是乙個十分高深的東西,但是或許我們身邊就存在生產者消費者模型。打個比方,生活中我們經常在缺少生活用品或者其他商品的時候我們通常會選擇去超市,那也就不難理解,我們其實就是所謂的消費者。那生產者是超市麼?答案是否定的,如果超市是...
Linux 基於環形佇列的生產消費模型
在上篇部落格基於阻塞佇列的生產者消費者模型中我介紹了什麼是生產者消費者模型,還沒了解的可以戳鏈結檢視。本篇部落格也是實現乙個生產者消費者模型,只是這篇部落格我將基於迴圈佇列實現生產消費模型。posix 訊號量 這裡要注意了,我們這次使用的是基於posix的訊號量,千萬不要誤認為是systemv的訊號...
基於陣列實現阻塞佇列
基於陣列實現的話,需要額外兩個指標,乙個指向頭元素,乙個指向尾元素。出的時候從頭元素出去,入的時候從尾元素入。即出的時候tail指標 1,入的時候尾指標 1 因此使用乙個環形佇列最好,不會浪費空間也不需要挪動元素位置。因為是環形佇列,因此tail在最後乙個位置的時候,再進來乙個元素,如果佇列不滿,就...