生产者-消费者问题(producer-consumer-problem)
2016-05-05 10:10
453 查看
生产者消费者问题是一个著名的线程同步问题,问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。
简化问题:假设生产者和消费者都只有一个,且缓冲区也只有一个。
利用线程、互斥量、条件变量解决生产者-消费者问题:
运行结果如下
简化问题:假设生产者和消费者都只有一个,且缓冲区也只有一个。
利用线程、互斥量、条件变量解决生产者-消费者问题:
/************************************************************************* > Created Time: Thu 05 May 2016 06:26:40 AM PKT ************************************************************************/ #include<stdio.h> #include <pthread.h> #define MAX 10 pthread_mutex_t mutex; //互斥量 pthread_cond_t condc,condp; //条件变量 //条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。 int buffer=0; //缓冲区 //生产者 void* producer(void* ptr) { int i=0; for(i=1;i<=MAX;i++){ pthread_mutex_lock(&mutex); while(buffer!=0){ pthread_cond_wait(&condp,&mutex); } //now buffer==0 buffer=i; printf("producer put %d to buffer\n",i); pthread_cond_signal(&condc); pthread_mutex_unlock(&mutex); } pthread_exit(0); } //消费者 void* consumer(void* ptr) { int i=0; for(i=1;i<=MAX;i++){ pthread_mutex_lock(&mutex); while(buffer==0){ pthread_cond_wait(&condc,&mutex); } //now buffer!=0 printf("consumer get %d from buffer\n",buffer); buffer=0; pthread_cond_signal(&condp); pthread_mutex_unlock(&mutex); } pthread_exit(0); } //测试 int main(int argc,char** argv) { pthread_t pro,con; pthread_create(&pro,NULL,producer,NULL); pthread_create(&con,NULL,consumer,NULL); pthread_mutex_init(&mutex,NULL); pthread_cond_init(&condp,NULL); pthread_cond_init(&condc,NULL); pthread_join(pro,NULL); pthread_join(con,NULL); pthread_cond_destroy(&condc); pthread_cond_destroy(&condp); pthread_mutex_destroy(&mutex); }
运行结果如下
相关文章推荐
- Jedis对于Redis的使用(一)
- Wireshark: There are no interfaces on which a capture can be done
- 数组去重方法总结
- rac ORA-00245 报错
- 28岁papi酱正在过时 00后网红的实用战争
- Android Studio 导出APK
- KairosDB 监控系统介绍
- MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚
- 4月国内操作系统份额:Win 7份额52% 霸主地位巩固
- Mybatis与Ibatis的区别
- 四大主流开源BI商业智能平台对比评测
- Linux死锁调试之hardlockup
- ios开发笔记-设置带图片的button的圆角在AL下失效
- Zookeeper分布式集群安装教程
- LeetCode OJ 106. Construct Binary Tree from Inorder and Postorder Traversal
- Zclip点击复制内容到剪贴板兼容各浏览器
- 如何把.cs文件编译成DLL文件
- Bootstrap每天必学之导航条
- 视频为Activity背景
- 深入分析Parquet列式存储格式