生產者消費者共享緩衝區,生產者向緩衝區中放資料,消費者從緩衝取中取資料,當緩衝區中被放滿時,生產者程序就必須進入掛起狀態,直到消費者從緩衝中取走資料時,生產者才能繼續向緩衝區中存放資料,同樣當緩衝取中沒有資料時,消費者程序就必須進入掛起休眠狀態,直到生產者向緩衝區中放入資料時,消費者才能被喚醒繼續從緩衝區中取走資料。
因為有單生產者和單消費者,致使在乙個緩衝區滿時生產者需要等待消費,乙個緩衝區空時消費者也要等待生產。
利用兩個pthread庫中的互斥鎖
先定義初始化,利用靜態賦值法,以及定義兩個互斥鎖;
pthread_mutex_t mutex = pthread_mutex_initializer;
pthread_t thread[2]
;pthread_mutex_t mut;
pthread_mutex_t mut2;
先定義全域性變數,producer用的time1,consumer用的time2,以及大小為20的緩衝區,以及乙個函式t;
#include
#include
int buffer[20]
,t =
0,time1 =
0,time2 =
0;
分為兩個函式,乙個是生產者的函式;
先判斷是否已滿,滿則加鎖;
void
producer()
輸出生產者置於多少,增加迴圈引數,並且解鎖。
最後函式為:
void
producer()
printf
("生產者位於%d\n"
, time1)
; t++
; time1++
;pthread_mutex_unlock
(&mut2);}
}
再進行消費者函式;
void
consumer()
printf
("消費者得到%d\n"
, time2)
; t--
; time2;
pthread_mutex_unlock
(&mut);}
}
最後加入主函式;
int
main()
先進行頭檔案和巨集定義
//semaphores
#include
#include
#include
#include
#include
#include
#include
#include
#define buffer_size 5
定義semaphore記錄有多少個執行緒正在使用
sem_t empty, full, mutex;
定義緩衝區
int buffer[buffer_size]
;int in, out;
定義儲存資料的結構體
struct data
;
定義有限輸入
int
insert_item
(buffer_item item)
定義有限刪除
int
remove_item
(buffer_item *item)
接下來是生產者部分的函式
先定義生產者id,始末次數,總id
void
*producer
(void
* param)
然後是消費者的函式
void
*consumer
(void
* param)
最後進行主函式
定義執行緒識別符號,線成屬性
int
main()
else
if(role ==
'c')
pthread_create
(&tid,
&attr, consumer, d)
;}
最後釋放訊號量
sem_destroy
(&mutex)
;sem_destroy
(&empty)
;sem_destroy
(&full)
;return0;
}sem_destroy
(&mutex)
;sem_destroy
(&empty)
;sem_destroy
(&full)
;return0;
}
生產者消費者問題
public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...
生產者 消費者問題
在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...
生產者 消費者問題
1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...