线程同步之生产者-消费者问题
生產者-消費者問題(The Producer-Consumer Problem)是并發處理中最常見的一類同步抽象描述。先考慮但緩沖區的情況:有一個生產者進程P和一個消費者進程C公用一個緩沖區,P生產產品放入緩沖區,C從緩沖區取產品來消費。
同步問題:P進程不能往“滿”的緩沖區中放入產品,C進程不能從“空”的緩沖區中取產品。
互斥問題:緩沖區不能同時被P和C使用。
解決方法:設置兩個信號量full,empty,full表示緩沖區是否有產品,初值為0,empty表示緩沖區是否為空,初值為1.
1、解決單緩沖區生產者-消費者問題的描述如下:
struct semaphore
{
int value;
pointer_PCB quene;
}
semaphore S;
semaphore empty = 1;
semaphore full = 0;
main()
{
cobegin
? ? producer();
? ?consumer();
coend();
}
生產者-消費者進程描述如下:
void producer() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?void consumer()
{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
? ?while(true) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? while(true)
? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ?生產一個產品; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?P(fulll);
? ? ? ?P(empty); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?從緩沖區去產品;
? ? ? 送產品到緩沖區; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?V(empty);
? ? ? V(full); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 消費產品;
? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
2、考慮多個緩沖區的情況:設有若干個生產者進程P1,P2,···,Pn,若干個消費者進程C1,C2,···,Cm,它們通過一個緩沖池(由k個緩沖區組成)聯系起來,如圖所示
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
設每個緩沖區存放一個“產品”,生產者進程不斷的生產產品,并把它們放入到緩沖池中,消費者進程不斷的從緩沖池中取出產品并消費。
同步問題:當緩沖池已經放滿了產品時,生產者進程必須等待;當緩沖池已空時,消費者進程必須等待
互斥問題:互斥存在于所有進程之間,所有進程應互斥使用緩沖池這一臨界資源
為了了解生產者-消費者問題,需設置若干信號量:full,empty,mutex.其中mutex是互斥信號量,用于對緩沖池這一臨界資源的互斥訪問;full,empty是同步信號量,分別表示緩沖池滿和空的數量。
void main()
{
?int full(0),empty(0),mutex(1);
int in = out = 0;
buffer[n];
cobegin
? ?producer();
? ?consumer();
coend
}
void producer()
{
? ?while(true)
? ? ?{
? ? ? ? ···
? ? ? ? Producer an item in nextp;//生產一件產品
? ? ? ?···
? ? ? ? P(empty);
? ? ? ? P(mutex);
? ? ? ? buffer[in] = nextp;//向緩沖區存放一件產品
? ? ? ? in = (in +1)%n;
? ? ? ? V(mutex);
? ? ? ? V(full);
? ? ? }
}
void consumer()
{
? ?while(true)
? ? ?{
? ? ? ? ?P(full);
? ? ? ? ?P(mutex);?
? ? ? ? ?nextc = buffer[out];//從緩沖區取走一件產品
? ? ? ? ?out = (out+1)%n;
? ? ? ? ?V(mutex);
? ? ? ? ?V(empty);
? ? ? ? consumer the item nextc;//消費一件產品
? ? ?}
}
總結
以上是生活随笔為你收集整理的线程同步之生产者-消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 该懂的反射小操作
- 下一篇: 多线程之 CreateThread与_b