生產者與消費者問題(執行緒同步經典案例)

2021-10-07 01:36:56 字數 1428 閱讀 3692

生產者(producer)和消費者(consumer)問題是併發處理中最常見的一類問題,是乙個多執行緒同步問題的經典案例。

可以這樣描述這個問題,有乙個或者多個生產者產生某種型別的資料,並放置在固定大小的緩衝區中,乙個消費者從緩衝區中取資料,每次取一項,系統必須保證對緩衝區的重複操作,任何時候,只有乙個生產者或者消費者可以訪問緩衝區;同時,消費者只能在緩衝區不為空的時候從緩衝區中讀資料,生產者只能在緩衝區不為滿的時候向緩衝區寫入資料。

上面的問題總結起來有兩點:

第一是緩衝區的互斥訪問問題,任意時刻最多只能有乙個執行緒訪問緩衝區,linux下可以使用互斥量pthread_mutex_t對訪問緩衝區的臨界區**進行保護。

第二是生產者和消費者對緩衝區訪問的同步問題,生產者在緩衝區滿時不能向緩衝區中寫入資料,同時消費者在緩衝區空時不能讀取資料。

#include

#include

#include

#include

#include

#define producer_num 5

//生產者數目

#define consumer_num 5

//消費者數目

#define pool_size 11

//緩衝池大小

int pool[pool_size]

;//緩衝區

int head=0;

//緩衝池讀取指標

int rear=0;

//緩衝池寫入指標

sem_t room_sem;

//同步訊號訊號量,表示緩衝區有可用空間

sem_t product_sem;

//同步訊號量,表示緩衝區有可用產品

pthread_mutex_t mutex;

void

producer_fun

(void

*arg)

}void

consumer_fun

(void

*arg)

}int

main()

ret =

sem_init

(&product_sem,0,

0);//初始化訊號量product_sem為0,開始時緩衝池中沒有資料

if(ret !=0)

for(

int i =

0; i < producer_num; i++

)//建立消費者執行緒

ret =

pthread_create

(&consumer_id[i]

,null

, consumer_fun,

(void

*)i);if

(ret !=0)

}for

(int i=

0;i)exit(0

);}

生產者與消費者(執行緒同步問題)

主函式 public class productandcustorm 以下是產品類,生產者類,消費者類 產品 class product num p system.out.println 生產者生產了 p 個產品,現有 num 個產品.this.notifyall thread.sleep 200 ...

經典問題生產者 消費者問題

生產者 productor 將產品交給店員 clerk 而消費者 customer 從店員處 取走產品,店員一次只能持有固定數量的產品 此如 20 如果生產者試圖 生產更多的產品,店員會叫生產者停 下,如果店中有空位放產品了再通 知生產者繼續生產 如果店中沒有產品了,店員會告訴消費者等 一下,如 果...

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...