基于ACE_Message_Queue的生产者消费者模式
来源:互联网 发布:php ip白名单 编辑:程序博客网 时间:2024/06/04 15:48
1.生产者尽可能生产;2.消费者按照自身需求执行消费行为;code:class CMediaSendBlock : public ACE_Message_Block{public: CMediaSendBlock( const char* pData, const unsigned long ulDataLen) : ACE_Message_Block((size_t)ulDataLen, MB_DATA, 0, 0) { if (NULL != pData) { (void)this->copy(pData, (size_t) ulDataLen); } } virtual ~CMediaSendBlock() {}};class CMediaSendQueue : public ACE_Message_Queue<ACE_MT_SYNCH>{public: CMediaSendQueue() {} virtual ~CMediaSendQueue() {} int enqueue_tail_ex(CMediaSendBlock* pBlock) { ACE_Time_Value timeValue = ACE_OS::gettimeofday() + ACE_Time_Value(0, 10); int nRetVal = ACE_Message_Queue<ACE_MT_SYNCH>::enqueue_tail(pBlock, &timeValue); if (0 >= nRetVal) { return -1; } return nRetVal; }};CMediaSendQueue m_sendQueue;bool m_bRunning = true;//生产者//生产者尽可能快的生产void* produce(void *arg){ static int iThreadIndex = -1; ++iThreadIndex; std::cout << "this is produce thread num " << iThreadIndex << std::endl; int iSize = 1024 * 1024; char* pBuff = new char[iSize]; memset(pBuff, 0x0, iSize); while(m_bRunning) { CMediaSendBlock* pBlock = new CMediaSendBlock( pBuff, iSize); int iRet = m_sendQueue.enqueue_tail(pBlock, NULL); //等待到达低水位 if (0 >= iRet) { delete pBlock; pBlock = NULL; std::cout << "center is full...." << std::endl; } else { std::cout << "push success...." << std::endl; } } std::cout << "produce task finished...." << std::endl; return NULL;}//消费者//消费者按照自身需要的速度进行消费void* consume(void *arg){ static int iThreadIndex = -1; ++iThreadIndex; std::cout << "this is consume thread num " << iThreadIndex << std::endl; while(m_bRunning) { ACE_Message_Block* pBlock = NULL; if (-1 == m_sendQueue.dequeue_head(pBlock)) continue; //发送 CMediaSendBlock* pSendBlock = dynamic_cast<CMediaSendBlock*>(pBlock); if(NULL == pSendBlock) continue; std::cout << "I am consuming.... " << std::endl; //释放block delete pSendBlock; pSendBlock = NULL; std::cout << "message_bytes" << std::dec << m_sendQueue.message_bytes() << std::endl; std::cout << "message_length" << std::dec << m_sendQueue.message_length() << std::endl; ACE_OS::sleep(2); } std::cout << "consume over......" << std::endl; return NULL;}int main(int argc, char* argv[]){ ACE::init(); m_sendQueue.high_water_mark(10 * 1024 * 1024); m_sendQueue.low_water_mark(2 * 1024 * 1024); m_sendQueue.activate(); //m个生产者,n个消费者 //产生生产者线程 ACE_Thread_Manager::instance()->spawn_n ( 5, (ACE_THR_FUNC) produce ); ACE_OS::sleep(2); //让生产者填满仓库 ////产生消费者线程 ACE_Thread_Manager::instance()->spawn_n ( 2, (ACE_THR_FUNC) consume ); int iData; std::cin >> iData; //close m_bRunning = false; m_sendQueue.deactivate(); //wait ACE_OS::sleep(2); ACE::fini(); return 0;}
0 0
- 基于ACE_Message_Queue的生产者消费者模式
- 基于BlockingQueue的生产者消费者模式实现
- 基于wait和nofity的生产者和消费者模式版本
- 基于linux的生产者-消费者
- 线程的生产者消费者模式
- 典型的生产者消费者模式
- ACE_Message_Queue和spawn实现(生产者/消费者)(V2.00)
- 基于QT实现的生产者消费者模型
- 基于JAVA实现的生产者消费者模型
- 基于生产者和消费者问题的总结
- 基于单链表的生产者消费者问题
- 基于内置锁的生产者消费者模型
- 基于LinkedBlockingQueue的生产者消费者模型
- 基于ArrayBlockingQueue的生产者和消费者
- 生产者消费者模式的线程同步问题
- 面向过程的生产者消费者模式
- 使用Condition的生产者消费者模式
- JAVA 生产者消费者模式的实现
- ACE 内存管理
- SVN部署(本地)
- redisTemplate 操作
- LINUX下安装ORACLE11GR2
- 预处理器的小结
- 基于ACE_Message_Queue的生产者消费者模式
- 微信开发第一篇,使用Java创建成为开发者的应用
- 频率域上的图像增强
- C++ const 修饰成员函数
- 网络数据的XML解析
- Oracle 10g,11g flashback
- 随机生成一个对称矩阵,并输出。(究极版本,可以每一次都改变矩阵的随机数且不同,采用do while退出条件循环)
- C++ 左值引用与右值引用
- ACE定时器代码实现