操作系统实验五:进程同步问题实现

一、实验目的
利用实验四提供的方法和例子,解决进程同步相关问题,例如:生产者消费者问题,哲学家进餐等问题。
二、实验环境
硬件环境:计算机一台,局域网环境;
软件环境:Linux Ubuntu操作系统,gcc编译器
三、实验内容
运用实验四中提供的进程同步方法实现如下问题:
1、生产者消费者问题
问题描述:一组生产者进程向一组消费者进程提供产品,两类进程共享一个由n个缓冲区组成的有界缓冲池,生产者进程向空缓冲池中投放产品,消费者进程从放有数据的缓冲池中取得产品并消费掉。
只要缓冲池未满,生产者进程就可以把产品送入缓冲池;只要缓冲池未空,消费者进程便可以从缓冲池中取走产品。
但禁止生产者进程向满的缓冲池再输送产品,也禁止消费者进程从空的缓冲池中提取产品。
为了防止对缓冲池重复操作,故规定在任何时候,只有一个主体可以访问缓冲池。

#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<pthread.h> 
#include<semaphore.h> 

#define PRODUCER_NUM 5 //生产者数目 
#define CONSUMER_NUM 5 //消费者数目 
#define POOL_SIZE  11//缓冲池大小 

int pool[POOL_SIZE]; //缓冲区 
int head=0; //缓冲池读取指针 
int rear=0; //缓冲池写入指针 
sem_t  room_sem; //同步信号信号量,表示缓冲区有可用空间 
sem_t  product_sem; //同步信号量,表示缓冲区有可用产品 
pthread_mutex_t mutex; 

void *producer_fun(void *arg) 
{
    
	while (1) 
	{
    
		sleep(1); 
		sem_wait(&room_sem); 
		pthread_mutex_lock(&mutex); 
		//生产者往缓冲池中写入数据 
		pool[rear] = 1; 
		rear = (rear + 1) % POOL_SIZE; 
		printf("producer %d write to pool\n", (int)arg); 
		printf("pool size is %d\n",(rear-head+POOL_SIZE)%POOL_SIZE); 
		pthread_mutex_unlock(&mutex); 
		sem_post(&product_sem); 
	} 
} 

void *consumer_fun(void *arg) 
{
    
	while (1) 
	{
    
		int data; 
		sleep(10); 
		sem_wait(&product_sem); 
		pthread_mutex_lock(&mutex); 
		//消费者从缓冲池读取数据 
		data = pool[head]; 
		head = (head + 1) % POOL_SIZE; 
		printf("consumer %d read from pool\n", (int)arg); 
		printf("pool size is %d\n",(rear-head+POOL_SIZE)%POOL_SIZE); 
		pthread_mutex_unlock(&mutex); 
		sem_post(&room_sem); 
	} 
} 

int main() 
{
    
	int i; 
	pthread_t producer_id[PRODUCER_NUM]; 
	pthread_t consumer_id[CONSUMER_NUM]
  • 19
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值