生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例。

生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

下面是一个m生产者n消费者k缓冲区的问题实现

在ubuntu12.10下编译通过

#include

#include

#include

#include

#include

#define PRODUCER 10//生产者数量

#define CONSUMER 8//消费者数量

#define BUFFER 20//缓冲区数量

sem_t empty,full;//同步信号量

pthread_mutex_t mutex;//互斥信号量

int buffer[BUFFER]; //缓冲区

int producer_id=0,consumer_id=0;//生产者消费者ID

int index_in=0,index_out=0;//生产者 消费者 存放 消费的位置

void print()//输出缓冲区

{

int i;

printf("Buffer:\n");

for(i=0;i<20;i++)

{

printf("___");

}

printf("\n");

for(i=0;i<20;i++)

printf("|%d|",buffer[i]);

printf("\n");

for(i=0;i<20;i++)

{

printf("———");

}

printf("\n");

}

void *Producer()//生产者函数

{

int ID=++producer_id;

while(1)

{

sleep(3);

sem_wait(&empty);

pthread_mutex_lock(&mutex);

index_in=index_in%BUFFER;

printf("Producer %d in %d.\n",ID,index_in);

buffer[index_in]=1;//缓冲区置0

print();//输出缓冲区情况

index_in++;

pthread_mutex_unlock(&mutex);

sem_post(&full);

}

}

void *Consumer()//消费者函数

{

int ID=++consumer_id;

while(1)

{

sleep(3);

sem_wait(&full);

pthread_mutex_lock(&mutex);

index_out=index_out%BUFFER;

printf("\033[01;34mConsumer %d in %d\033[0m\n",ID,index_out);

buffer[index_out]=0;//缓冲区置0

print();//输出缓冲区情况

index_out++;

pthread_mutex_unlock(&mutex);

sem_post(&empty);

}

}

int main()

{

//freopen("text.txt","w",stdout);

int rthread[18],i;

pthread_t producer[PRODUCER];//生产者

pthread_t consumer[CONSUMER];//消费者

int sinit1=sem_init(&empty,0,BUFFER);//初始化同步信号量

int sinit2=sem_init(&full,0,0);

int minit =pthread_mutex_init(&mutex,NULL);//初始化互斥信号量

if(sinit1 && sinit2)

{

printf("sem initialize failed /n");

exit(1);

}

if(minit)

{

printf("sem initialize failed /n");

exit(1);

}

for(i=0;i

{

rthread[i]=pthread_create(&producer[i], NULL, Producer, NULL);

if(rthread[i])

{

printf("producer %d create failed /n", i);

exit(1);

}

}

for(i=0;i

{

rthread[i]=pthread_create(&consumer[i], NULL, Consumer,NULL);

if(rthread[i])

{

printf("consumer %d create failed /n", i);

exit(1);

}

}

for(i=0;i

{

pthread_join(producer[i],NULL);

}

for(i=0;i

{

pthread_join(consumer[i],NULL);

}

exit(0);

}

运行结果

…………

windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现相关推荐

  1. C语言生产者消费者实验报告,生产者与消费者实验报告.doc

    生产者与消费者实验报告.doc 生产者和消费者实验报告[实验目的]1. 加深对进程概念的理解,明确进程和程序的区别.2. 进一步认识并发执行的实质.3. 验证用信号量机制实现进程互斥的方法.4. 验证 ...

  2. c语言生产者与消费者实验报告,生产者和消费者实验报告.doc

    生产者和消费者实验报告 [实验目的] 加深对进程概念的理解,明确进程和程序的区别. 进一步认识并发执行的实质. 验证用信号量机制实现进程互斥的方法. 验证用信号量机制实现进程同步的方法. [实验要求] ...

  3. C语言——生产者消费者问题

    百度文献查看原文 核心代码: #include<stdio.h> #include<time.h> #include<stdlib.h> #include<s ...

  4. 基于kafka_2.11-2.1.0实现的生产者和消费者代码样例

    1.搭建部署好zookeeper集群和kafka集群,这里省略. 1 启动zk: 2 bin/zkServer.sh start conf/zoo.cfg. 3 验证zk是否启动成功: 4 bin/z ...

  5. 生产者和消费者代码———操作系统_操作系统基础15-生产者消费者问题

    在上一篇操作系统基础14提到通过信号量解决生产者消费者问题.本篇来详细说说操作系统中的经典问题-生成者消费者问题 生产者消费者问题 (Producer-consumer problem) 该问题是一个 ...

  6. java生产者消费者代码_Java实现Kafka生产者消费者代码实例

    Kafka的结构与RabbitMQ类似,消息生产者向Kafka服务器发送消息,Kafka接收消息后,再投递给消费者. 生产者的消费会被发送到Topic中,Topic中保存着各类数据,每一条数据都使用键 ...

  7. java 生产者消费者代码_Java生产者和消费者代码

    java 生产者消费者代码 This also helps us to understand the concept of synchronised multi-threading in java, ...

  8. 生产者消费者代码_生产者消费者模型:Kotlin 多线程读写文件实例

    计算机科学中的所有问题,都可以通过添加一个间接层来解决. 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题. 生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产 ...

  9. 用 wait-notify 写一段代码来解决生产者-消费者问题

    用 wait-notify 写一段代码来解决生产者-消费者问题 参考文章: (1)用 wait-notify 写一段代码来解决生产者-消费者问题 (2)https://www.cnblogs.com/ ...

  10. java生产消费模型代码实现_生产者-消费者模型的Java实现

    本文转自:http://tanlan.iteye.com/blog/1158154 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个 ...

最新文章

  1. 序列化模块--json模块--pickle模块-shelve模块
  2. 半可信混合技术:BCH混币工具CashShuffle引入STAT
  3. C++使用GDI+实现图片格式转换
  4. 浮点数在计算机中是如何表示的
  5. 10 个实战及面试常用 Shell 脚本编写
  6. Redis和MongoDB的区别
  7. java查错题(经常混淆)
  8. 怀念08,憧憬09;08盘点,09启航。
  9. pandas 时间序列分析(一)—— 基础
  10. 2016CCPC合肥赛区总结
  11. 《大话数据结构》学习笔记
  12. matlab实现带通滤波器的方法,数字信号处理课程设计---带通滤波器的设计及其MATLAB实现.doc...
  13. 贪心算法c语言部分背包,c语言背包问题_背包问题贪心算法_背包问题 贪心算法(13)...
  14. 2017-2018-2 20179215《网络攻防实践》第八周作业
  15. 卷积操作中的group
  16. vuex Loding加载..
  17. GCC汇编源码中的.rept关键字
  18. 蓝牙耳机选哪个?盘点双十二必入的高性价比蓝牙耳机
  19. ubuntu 8000端口被占用
  20. 卡尔曼滤波(kalman)相关理论以及与HMM、最小二乘法关系

热门文章

  1. MetaPhlAn2-增强版宏基因组分类谱工具
  2. R语言使用moments包计算偏度(Skewness)和峰度(Kurtosis)实战:计算偏度(Skewness)和峰度(Kurtosis)、确定样本数据是否具有与正态分布匹配的偏度和峰度(假设检验)
  3. R语言dplyr包使用anti_join()函数返回在一个dataframe中存在而在另一个dataframe中没有匹配值的所有行实战
  4. 一例IBM服务器Raid磁盘阵列故障
  5. 边缘计算Edage Computing
  6. php获取全部post_php post获取所有提交
  7. python 循环批量生成变量
  8. matplotlib pcolormech 用法
  9. windows10下mysql-8.0.21的安装和使用
  10. python 播放 wav 文件