• 2022-06-26
    使用线程实现生产者-消费者模型,仓库中最多可存储16个产品,若仓库未满,生产者可继续生产产品,否则等待仓库变为未满状态;若仓库非空,消费者可从仓库中取出产品,否则要求使用互斥锁实现生产者和消费者的互斥操作。此外要求生产者和消费者不可同时对仓库进行操作。
  • #INCLUDE<STDIO.H>#INCLUDE<STDLIB.H>#INCLUDE<TIME.H>#INCLUDE"PTHREAD.H"#DEFINEBUFFER_SIZE16#DEFINEOVER-1STRUCTPRODCONSBUFFER;//设置一个存储整数的循环缓冲区STRUCTPRODCONS{INTBUFFER[BUFFER_SIZE];//缓冲区数组PTHREAD_MUTEX_TLOCK;//互斥锁INTREADPOS,WRITEPOS;//读写的位置PTHREAD_COND_TNOTEMPTY;//缓冲区非空信号PTHREAD_COND_TNOTFULL;//缓冲区非满信号};//初始化缓冲区VOIDINIT(STRUCTPRODCONS*B){PTHREAD_MUTEX_INIT(&B->LOCK,NULL);PTHREAD_COND_INIT(&B->NOTEMPTY,NULL);PTHREAD_COND_INIT(&B->NOTFULL,NULL);B->READPOS=0;B->WRITEPOS=0;}//向缓冲区中写入一个整数VOIDPUT(STRUCTPRODCONS*B,INTDATA){PTHREAD_MUTEX_LOCK(&B->LOCK);//获取互斥锁//等待缓冲区非满WHILE((B->WRITEPOS+1)%BUFFER_SIZE==B->READPOS){PRINTF("WAITFORNOTFULLN");PTHREAD_COND_WAIT(&B->NOTFULL,&B->LOCK);//等待状态变量B->NOTFULL,不满则跳出阻塞}//写数据并且指针前移B->BUFFER[B->WRITEPOS]=DATA;B->WRITEPOS++;IF(B->WRITEPOS>=BUFFER_SIZE)B->WRITEPOS=0;//设置缓冲区非空信号PTHREAD_COND_SIGNAL(&B->NOTEMPTY);//设置状态变量PTHREAD_MUTEX_UNLOCK(&B->LOCK);//释放互斥锁}//从缓冲区中读出一个整数INTGET(STRUCTPRODCONS*B){INTDATA;PTHREAD_MUTEX_LOCK(&B->LOCK);//获取互斥锁//等待缓冲区非空WHILE(B->WRITEPOS==B->READPOS){PRINTF("WAITFORNOTEMPTYN");PTHREAD_COND_WAIT(&B->NOTEMPTY,&B->LOCK);//等待状态变量B->NOTEMPTY,不空则跳出阻塞。否则无数据可读}//读数据并且指针前移DATA=B->BUFFER[B->READPOS];B->READPOS++;IF(B->READPOS>=BUFFER_SIZE)B->READPOS=0;//设置缓冲区非满信号PTHREAD_COND_SIGNAL(&B->NOTFULL);//设置状态变量PTHREAD_MUTEX_UNLOCK(&B->LOCK);//释放互斥锁RETURNDATA;}VOID*PRODUCER(VOID*DATA){INTN;FOR(N=0;N<1000;N++){PRINTF("PUT-->%DN",N);PUT(&BUFFER,N);}PUT(&BUFFER,OVER);PRINTF("PRODUCERSTOPPED!N");RETURNNULL;}VOID*CONSUMER(VOID*DATA){INTD;WHILE(1){D=GET(&BUFFER);IF(D==OVER)BREAK;PRINTF("%D-->GETN",D);}PRINTF("CONSUMERSTOPPED!N");RETURNNULL;}INTMAIN(VOID){PTHREAD_TTH_A,TH_B;VOID*RETVAL;INIT(&BUFFER);PTHREAD_CREATE(&TH_A,NULL,PRODUCER,0);PTHREAD_CREATE(&TH_B,NULL,CONSUMER,0);//等待生产者和消费者结束PTHREAD_JOIN(TH_A,&RETVAL);PTHREAD_JOIN(TH_B,&RETVAL);RETURN0;}

    内容

    • 0

      系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形 缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待; 当緩冲区未空时,消费者进程可以从緩冲区取走一件产品,否则等待。要求一个消费者进程 从缓冲区连续取出10件产品后,其他消费者进程才可以取产品。请使用信号量P,V(wait(), signal())操作实现进程间的互斥与同步,要求写出完整的过程,并说明所用信号量的含义和 初值。

    • 1

      由于生产和消费分离的原因,生产者所生产产品的品种和数量与消费者所需要的产品的品种和数量总是会有矛盾。

    • 2

      属于消费者的是(P25)() A: 生产者 B: 还原者 C: 真菌 D: 杂食者

    • 3

      【单选题】生态系统中,能量流动的途径主要是 A. 生产者—消费者-分解者 B. 生 产 者 - 分解者 — 消费者 C. 分解者 — 消费者 - 生 产 者 D. 消费者-分解者- 生 产 者

    • 4

      下列对应有误的是______ A: 生产者→二氧化碳、水 B: 消费者→生产者 C: 生产者→有机营养 D: 还原者→生产者、消费者的残体