进程的同步和互斥实验

源代码

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
#define N 6
int speed_producer=1,speed_consumer=4;
int in,out,count;//in表示防止产品的数量,out表示拿出产品的数量,N表示缓冲区可放产品数量,count表示当前产品数量
int buffer[N];//缓冲区
sem_t empty,full,mutex;//设置信号量empty表示空位置,full表示有多少产品占着的位置,初始设置没有产品,mutex互斥信号量使消费者和生产者对缓冲区进行互斥访问
void init()
{
sem_init(&mutex,0,1);
sem_init(&empty,0,N);
sem_init(&full,0,0);
in=0;
out=0;
count=0;
}
void *producerThread()
{
While(1){
sem_wait(&empty);//申请资源,如果empty>0表明有位置可以生产,否则线程会堵塞
sem_wait(&mutex);//申请放缓冲的位置,看是否有进程在调用
buffer[in]=0+rand()%6;
count++;
in=(in+1)%N;
if(in!=0)
printf(“生产者生产产品,此时缓冲区产品的个数为%d\n产品存放在缓冲池第%d个位置\n”,count,in);
else
printf(“生产者生产产品,此时缓冲区产品的个数为%d\n产品存放在缓冲池第6个位置\n”,count)
sem_post(&mutex);//释放缓冲区的位置
sem_post(&full);//满的位置多了一个
sleep(speed_producer);
}
}
Void *consumerThread()
{
while(1){
sem_wait(&full);//申请资源,看有没有产品可以被获取
sem_wait(&muex);//申请放缓冲的位置,看是否有进程在调用
count--;
out=(out+1)%N;
if(out!=0)
printf(“消费者消费产品,此时缓冲区产品的个数为%d\n产品消费在缓冲池第%d个位置\n”,count,out);
else
printf(“消费者消费产品,此时缓冲区产品的个数为%d\n产品消费在缓冲池第6个位置\n”,count);
sem_post(&mutex);//释放缓冲区的位置
sem_post(&empty);//加上一个empty的位置,空的位置多了一个
sleep(speed_consumer);
}
}
int main()
{
pthread_t producer,consumer;
init();
pthread_create(&producer,NULL,producerThread,NULL);
pthread_create(&consumer,NULL,consumerThread,NULL);
pthread_join(producer,NULL);
pthread_join(consumer,NULL);
sem_destroy(&mutex);
sem_destroy(&empty);
sem_destroy(&full);
exit(0);
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值