用条件变量和信号量解决生产者和消费者问题
2012-03-06 23:57
459 查看
用条件变量解决生产者和消费者问题(只有一个缓冲区):
结果如下:
利用信号量实现生产者于消费者问题,默认缓存区空间为10.List队列用来存放生产的产品。
结果如下:
#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()); //创建消费者线程 }
结果如下:
利用信号量实现生产者于消费者问题,默认缓存区空间为10.List队列用来存放生产的产品。
#define MAXITEMS 10 List* 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()); }
结果如下:
相关文章推荐
- 信号量解决生产者-消费者问题
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- 1,使用信号量解决生产者-消费者问题
- System V共享内存与信号量综合应用之生产者与消费者问题解决
- 用信号量解决生产者消费者问题
- Linux下用环形buf以及POSIX版本信号量解决生产者消费者问题
- 通过信号量机制解决生产者-消费者问题的模拟程序
- 信号量解决生产者-消费者问题
- java信号量PV操作 解决生产者-消费者问题
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
- Linux多线程实践(5) --Posix信号量与互斥量(解决生产者消费者问题)
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
- 记录型信号量解决消费者-生产者问题
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
- 用信号量解决生产者消费者问题
- 【坑】记录型信号量/AND信号量/管程解决生产者-消费者问题
- 信号量解决生产者,消费者问题
- 用信号量做进程同步解决生产者和消费者遇到的奇怪问题
- Linux多线程实践(五 )Posix信号量和互斥锁解决生产者消费者问题