1、编写程序,使用Linux操作系统中的信号量机制模拟实现生产者-消费者问题。设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生成产品放入缓冲区,消费者不断从缓冲区中取出产品,消费产品。
注意:pthread库并非Linux操作系统的默认库,编译时需加上-lpthread选项,以调用该链接库
源代码:
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#define MAX 256
char *buffer;
sem_t empty; //定义同步信号量empty
sem_t full; //定义同步信号量full
sem_t mutex; //定义互斥信号量mutex
void * producer() //生产者
{
sem_wait(&empty); //empty的P操作
sem_wait(&mutex); //mutex的P操作
printf("input something to buffer:");
buffer=(char *)malloc(MAX); //给缓冲区分配内存空间
fgets(buffer,MAX,stdin); //输入产品至缓冲区
sem_post(&mutex); //mutex的V操作
sem_post(&full); //full的V操作
}
void * consumer() //消费者
{
sem_wait(&full); //full的P操作
sem_wait(&mutex); //mutex的P操作
printf("read product from buffer:%s",buffer); //从缓冲区中取出产品
memset(buffer,0,MAX); //清空缓冲区
sem_post(&mutex); //mutex的V操作
sem_post(&empty); //empty的V操作
}
int main()
{
pthread_t id_producer;
pthread_t id_consumer;
int ret;
sem_init(&empty,0,10); //设置empty到初值为10
sem_init(&full,0,0); //设置full到初值为0
sem_init(&mutex,0,1); //设置mutex到初值为1
ret=pthread_create(&id_producer,NULL,producer,NULL); //创建生产者线程
ret=pthread_create(&id_consumer,NULL,consumer,NULL); //创建消费者线程
pthread_join(id_producer,NULL); //等待生产者线程结束
pthread_join(id_consumer,NULL); //等待消费者线程结束
sem_destroy(&empty); //删除信号量
sem_destroy(&full);
sem_destroy(&mutex);
printf("The End...\n");
}
实验结果:
2、本实验只模拟实现了一个产品的放入与取出,请修改代码,以模拟实现多个产品的放入与取出
原理是将原本定义的三个变量换成一个,并在最后加一个循环
其实这部分没多大把握,感觉循环那自己写的不太对有点乱,就提供下思路,糊弄实验报告够了
修改后:
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#define MAX 256
char *buffer;
sem_t first;
void * producer() //生产者
{
sem_wait(&first);
printf("input something to buffer:");
buffer=(char *)malloc(MAX); //给缓冲区分配内存空间
fgets(buffer,MAX,stdin); //输入产品至缓冲区
sem_post(&first);
}
void * consumer() //消费者
{
sem_wait(&first);
printf("read product from buffer:%s",buffer); //从缓冲区中取出产品
memset(buffer,0,MAX); //清空缓冲区
sem_post(&first);
}
int main()
{
pthread_t id_producer;
pthread_t id_consumer;
int ret;
sem_init(&first,0,1);
int i=0;
for(i=0;i<7;i++){
ret=pthread_create(&id_producer,NULL,producer,NULL); //创建生产者线程
ret=pthread_create(&id_consumer,NULL,consumer,NULL); //创建消费者线程
pthread_join(id_producer,NULL); //等待生产者线程结束
pthread_join(id_consumer,NULL); //等待消费者线程结束
}
sem_destroy(&first);
printf("The End...\n");
}