日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程同步之生产者-消费者问题

發布時間:2025/3/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程同步之生产者-消费者问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

生產者-消費者問題(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;//消費一件產品

? ? ?}

}

總結

以上是生活随笔為你收集整理的线程同步之生产者-消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。