LINUX操作系统实验 进程同步实验

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");
}

实验结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值