用条件变量和信号量解决生产者和消费者问题
来源:互联网 发布:社交软件如何盈利 编辑:程序博客网 时间:2024/03/29 16:53
用条件变量解决生产者和消费者问题(只有一个缓冲区):
结果如下:
#define MAX 100 //最大操作次数 int buffer = 0; //用来记录缓冲区中是否为空,只有一个缓冲区Lock* mutex;Condition* condc;Condition* condp;//生产者void Producer(int tid){ for(int i = 1;i < MAX;i++) { mutex->Acquire(); //加锁 while(buffer != 0) condp->Wait(mutex); //如果缓冲区值不为0,缓冲区满,等待消费者清空 buffer = i; //将缓冲区中值设为i printf("tid= %d,Produce a new item. i = %d\n",tid,i); condc->Signal(mutex); //向消费者发送信号 mutex->Release(); //解锁 }}//消费者void Consumer(int tid){ for(int i = 1; i < MAX; i++) { mutex->Acquire(); //加锁 while(buffer == 0) condc->Wait(mutex); //当缓冲区值为0时,缓冲区为空,等待生产者 buffer = 0; //将缓冲区置为空 printf("tid = %d,Consume a item. i = %d\n",tid,i); condp->Signal(mutex); //向生产者发送信号 mutex->Release(); //解锁 }}void TestPC(){ mutex = new Lock("mutex"); condc = new Condition("condc"); condp = new Condition("condp"); Thread *tp = Thread::getInstance("producer thread"); if(tp != NULL) tp->Fork(Producer,tp->getTid()); //创建生产者线程 Thread *tc = Thread::getInstance("consumer thread"); if(tc != NULL) tc->Fork(Consumer,tc->getTid()); //创建消费者线程}
结果如下:
#define MAXITEMS 10List* list;Semaphore* smutex;Semaphore* full;Semaphore* empty;void Producer1(int tid){ int* item; int flag = 1; for(int i = 0;i < 30;i++) { item = &flag; //生产一项 printf("tid = %d, Produce a new item, item =%d\n",tid,(*item)); empty->P(); //empty - 1 smutex->P(); list->Append(item); //放入共享区域 smutex->V(); full->V(); //full + 1 } }void Consumer1(int tid){ int* item; for(int i = 0;i < 30;i++) { full->P(); //full - 1 smutex->P(); item = (int*)list->Remove(); //从共享区域中移除 smutex->V(); empty->V(); //empty + 1 *item = 0; //消费一项 printf("tid = %d, Consume a item, item =%d\n",tid,*item); }}void TestPC1(){ list = new List; smutex = new Semaphore("mutex",1); //互斥信号量 empty = new Semaphore("empty",MAXITEMS); //记录空间中空余数 full = new Semaphore("full",0); //记录空间中存放数目 Thread *tp = Thread::getInstance("producer thread"); if(tp != NULL) tp->Fork(Producer1,tp->getTid()); Thread *tc = Thread::getInstance("consumer thread"); if(tc != NULL) tc->Fork(Consumer1,tc->getTid());}
结果如下:
- 用条件变量和信号量解决生产者和消费者问题
- 互斥锁加条件变量解决生产者消费者问题
- 用条件变量来解决生产者消费者问题
- pthread-生产者消费者问题【采用互斥量和条件变量】
- 用信号量解决生产者消费者问题
- 用信号量解决生产者消费者问题
- 用信号量做进程同步解决生产者和消费者遇到的奇怪问题
- 分别在windows和linux下用信号量解决生产者消费者问题
- 信号量解决生产者,消费者问题
- 信号量解决生产者-消费者问题
- Linux多线程实践(五 )Posix信号量和互斥锁解决生产者消费者问题
- 条件变量+互斥锁解决生产者消费者模型
- 线程同步2 ------ 用条件变量来解决生产者消费者问题
- 1,使用信号量解决生产者-消费者问题
- 记录型信号量解决消费者-生产者问题
- 信号量机制解决生产者--消费者问题
- Linux多线程,生产者消费者算法和条件变量的使用
- 生产者--消费者模型之互斥锁和条件变量
- apk在模拟器中能运行而手机中运行不了
- XBT TRACKER INSTALLATION
- WP7创建动画闪屏,启动画面所有知识深入详解(附源码)
- 完整版仿google分页,已发
- filter,map,reduce
- 用条件变量和信号量解决生产者和消费者问题
- <学习笔记>使用#ifndef, #define, #endif
- Windows下查找纯文本文件中的字符串 - 命令findstr简介(转)
- 文件使用二进制模式打开情况下的换行的方法
- 为ListBox的SelectedItem添加动画(附源码)
- TCP/IP协议学习笔记
- 0/1背包问题动态规划详解
- 一位老电子工程师十年的职场感悟
- SAX解析xml 网友写的