生產者(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 如果生產者試圖 生產更多的產品,店員會叫生產者停 下,如果店中有空位放產品了再通 知生產者繼續生產 如果店中沒有產品了,店員會告訴消費者等 一下,如 果...
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...