进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者
問題描述:
一組生產者進程和一組消費者進程共享一個初始為空、大小為 n 的緩沖區,只
有緩沖區沒滿時,生產者才能把消息放入到緩沖區,否則必須等待;只有緩沖區
不空時,消費者才能從中取出消息,否則必須等待。由于緩沖區是臨界資源,它
只允許一個生產者放入消息,或者一個消費者從中取出消息。
分析:
關系分析:生產者和消費者對緩沖區互斥訪問是互斥關系,同時生產者和
消費者又是一個相互協作的關系,只有生產者生產之后,消費者才能消費,
它們也是同步關系。
整理思路:這里比較簡單,只有生產者和消費者兩個進程,且這兩個進程
存在著互斥關系和同步關系。那么需要解決的是互斥和同步的 PV 操作的
位置。3. 信號量設置:信號量 mutex 作為互斥信號量,用于控制互斥訪問緩沖池,
初值為 1;信號量 full 用于記錄當前緩沖池中“滿”緩沖區數,初值為 0;
信號量 empty 用于記錄當前緩沖池中“空”緩沖區數,初值為 n。
代碼如下:
還是有點缺陷
如果編譯失敗,要額外加參數:-lpthread,例如:gcc -o p2 p2.c -lpthread
#include
#include
#include
#include
typedef int semaphore;
typedef int item;
#define Num 10
#define producerNum 10
#define consumerNum 10
item buffer[Num]={0};
int in=0, out=0;
int nextp=0, nextc=0;
semaphore mutex=1, empty=Num, full=0;
void *producer(void *a){
do {
/* code */
while (empty <= 0) {
/* code */
//printf("緩沖區已滿\n");
}
empty--;
while(mutex <= 0);
mutex--;
nextp++;
printf("Producer--生產一個產品ID%d, 緩沖區位置為%d\n",nextp,in );
buffer[in]=nextp;
in=(in+1)%Num;
//proCount--;
mutex++;
full++;
sleep(100);
}while(1);
}
void *consumer(void *b){
do {
/* code */
while (full<=0) {
/* code */
//printf("緩沖區為空\n");
}
full--;
while(mutex <= 0 );
mutex--;
nextc=buffer[out];
printf("\t\t\tConsumer--消費一個產品ID%d, 緩沖區位置為%d\n",nextc,out );
out=(out+1)%Num;
mutex++;
empty++;
sleep(100);
} while(1);
}
int main(int argc, char const *argv[]) {
/* code */
//設置線程池
int all=producerNum+consumerNum;
pthread_t threadPool[all];
//生產者進程添加進入線程池
int i;
for(i=0; i < producerNum; i++){
pthread_t temp1;
if(pthread_create(&temp1,NULL,producer,NULL) == -1){
/* code */
printf("ERROR, fail to create producer%d\n", i);
exit(1);
}
threadPool[i]=temp1;
}
//消費者進程添加進入線程池
for(i=0; i < producerNum; i++){
pthread_t temp2;
if(pthread_create(&temp2,NULL,consumer,NULL) == -1){
/* code */
printf("ERROR, fail to create consumer%d\n", i);
exit(1);
}
threadPool[i+producerNum]=temp2;
}
//啟動線程池
void *result;
for(i=0; i
if (pthread_join(threadPool[i],&result) == -1) {
/* code */
printf("ERROR\n");
exit(1);
}
}
return 0;
}
總結
以上是生活随笔為你收集整理的进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最新pr值大于6的网站大全
- 下一篇: 南通大学计算机专业分数线2020,南通大