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