ACE_Semaphore信号量生产着消费者队列
来源:互联网 发布:大自考网络运营计划书 编辑:程序博客网 时间:2024/06/06 05:41
这个信号量机制在win32和linux上都支持,没有什么特别的感觉。直接上Demo如下,这个Demo也是经典的生产者消费者的实现: [cpp] view plaincopy// thread_semaphore.cpp #include "ace/Task.h" #include "ace/Semaphore.h" class Consumer:public ACE_Task <ACE_MT_SYNCH> { public: enum{ N_THREADS = 5 }; Consumer(ACE_Semaphore& psema, ACE_Semaphore& csema):m_psema(psema), m_csema(csema), m_exitCondition(0) {} int isClose() { return m_exitCondition; } int svc(void) { while (!isClose()) { consumeItem(); } return 0; } void consumeItem() { m_csema.acquire(); if (!isClose()) { ACE_Message_Block *mb; this->getq(mb); if (mb->msg_type() == ACE_Message_Block::MB_HANGUP) { shutdown(); mb->release(); return; } else { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t) Consumed %d \n"), *((int *)mb->rd_ptr()))); mb->release(); } m_psema.release(); } } void shutdown(void) { m_exitCondition = 1; this->msg_queue()->deactivate(); m_csema.release(N_THREADS); } private: ACE_Semaphore& m_psema; ACE_Semaphore& m_csema; int m_exitCondition; }; class Producer:public ACE_Task_Base { public: enum{MAX_PROD = 128}; Producer(ACE_Semaphore &psema, ACE_Semaphore &csema, Consumer &consumer) :m_psema(psema), m_csema(csema), m_consumer(consumer) {} void producItem(int item) { m_psema.acquire(); ACE_Message_Block *mb = new ACE_Message_Block(sizeof(int),ACE_Message_Block::MB_DATA); ACE_OS::memcpy(mb->wr_ptr(), &item, sizeof(item)); mb->wr_ptr(sizeof(int)); this->m_consumer.putq(mb); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t) Prodeced %d\n"), item)); m_csema.release(); } int svc(void) { for (int i=0; i<=MAX_PROD; i++) { producItem(i); } hangUp(); return 0; } void hangUp() { m_psema.acquire(); ACE_Message_Block *mb = new ACE_Message_Block(0, ACE_Message_Block::MB_HANGUP); this->m_consumer.putq(mb); m_csema.release(); } private: ACE_Semaphore& m_psema; ACE_Semaphore& m_csema; Consumer& m_consumer; }; int ACE_TMAIN(int, ACE_TCHAR *[]) { ACE_Semaphore psem(5); ACE_Semaphore csem(0); Consumer consumer(psem, csem); Producer producer(psem, csem, consumer); producer.activate(); consumer.activate(THR_NEW_LWP | THR_JOINABLE, Consumer::N_THREADS); producer.wait(); consumer.wait(); return 0; };
0 0
- ACE_Semaphore信号量生产着消费者队列
- POSIX信号量与生产着消费者问题
- 多线程之信号量--生产消费者问题
- ACE生产消费者队列就是消息队列
- 非阻塞队列实现生产消费者模式
- 生产者-消费者-信号量-共享内存-循环队列
- Linux 生产者、消费者之环形队列信号量
- Java多线程生产消费者模式和BlockingQueue同步队列
- 生产消费者力量
- 生产消费者 多线程 代码
- 生产消费者模型
- 未完成-生产消费者模型
- 生产消费者问题代码
- 生产消费者模式
- linux生产消费者模型
- 生产消费者问题 CreateMutex
- 生产消费者模式
- 生产消费者模式
- ACE_Timer_Queue
- web前端优化方案
- 程序员创业的十大心得
- 工厂方法模式(创建型模式)
- 自定义一个动态数组
- ACE_Semaphore信号量生产着消费者队列
- JAX-RS:开发一个简单的服务
- (回溯法) 数据结构_回溯法求解迷宫路径
- iOS中alloc与init
- TabHost
- 第07周:项目五:复制模版类
- ACE_Message_Queue
- poj 1135 Domino Effect(最短路+枚举)
- 汇编--二进制到多种进制的转换与输出