信号量,互斥锁实现 生产者-消费者模式

生产者负责生成,消费负责消耗。产品满的时候,停止生成,开始消费。空的时候停止消费,开始生产。消费和生成是不能见面(同时操控数据)

 

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

typedef struct data{
 pthread_mutex_t mutex;
 sem_t full;
 sem_t empty;
 int val[10];
}dataPro;

void* product(void *d){
 sleep(5);
 dataPro* data = (dataPro*)d;
 while(1){
  sem_wait(&data->empty);//为空的时候开始生产
  pthread_mutex_lock(&data->mutex);
  for(int i = 0; i < 10; i++){
   data->val[i] = 1;
   printf("生产者:count = %d,data = %d\n",i , data->val[i]);
   
  }
  sleep(5);
  pthread_mutex_unlock(&data->mutex);
  sem_post(&data->full);
 }
}

void* consume(void *d){
 sleep(5);
 dataPro* data = (dataPro*)d;
 while(1){
  sem_wait(&data->full);//满了 就开始消费
  pthread_mutex_lock(&data->mutex);
  for(int i = 0; i < 10; i++){
   data->val[i] = 0;
   printf("消费者:count = %d,data = %d\n", i,data->val[i]);
  }
  sleep(5);
  pthread_mutex_unlock(&data->mutex);
  sem_post(&data->empty);
 }
}
//数据 初始化
dataPro* initData(){
 dataPro *data = (dataPro*)malloc(sizeof(data));
 sem_init(&data->empty, 0, 1);
 sem_init(&data->full, 0 ,0);
 pthread_mutex_init(&data->mutex, NULL);
 return data;
}

int main(){
 dataPro *data= initData();

 pthread_t pthreadWait,pthreadPost;
 //开始2个线程,生产,消费
 pthread_create(&pthreadWait, NULL, consume, data);
 pthread_create(&pthreadPost, NULL, product, data);

 //数据清理
 sleep(50);
 pthread_join(pthreadPost, NULL);
 pthread_join(pthreadWait, NULL);
 sem_destroy(&data->empty);
 sem_destroy(&data->full);
 free(data);
 return 0;
}

 结果:

网上有很多关于生产者消费原理的描述,这里就不做过多陈述了,只贴代码。

<a href="http://zh.wikipedia.org/wiki/%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98">wiki百科关于生产者,消费者描述</a>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值