欢迎来到天天文库
浏览记录
ID:39619711
大小:32.00 KB
页数:4页
时间:2019-07-07
《消息队列模板类》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、消息队列模板类templateclassTMessageQueue{public:vectorqueue;//存储消息的队列pthread_mutex_tmutex;sem_tsem;public:TMessageQueue(){pthread_mutex_init(&mutex,NULL);sem_init(&sem,0,0);}~TMessageQueue(){pthread_mutex_destroy(&mutex);sem_destroy(&sem);FreeQueue();}/*将记录插入消息队列的尾部,正常情况下,放在队列尾部,从头部
2、取*/voidAddElement(TDatapData){Lock();queue.push_back(pData);SetQueueEvent();Unlock();}/*将记录放在队列的头部,当外部请求取消、断开、异常退出时,接入层将消息放入队列的头部,分发时,将还没有处理的相应消息从队列中删除,将取消的消息放入业务线程的接收队列,业务线程进行释放处理*/voidAddElementAtFront(TDatapData){Lock();queue.insert(queue.begin());//push_back(pData);SetQueueEvent();Unlock();
3、}intcount(){returnqueue.size();}/*从队列头部取一条记录*/TDataGetElement(){WaitQueueEvent();TDatap;//=NULL;//vector::iteratorit;memset(&p,0,sizeof(TData));Lock();if(false==queue.empty()){p=*queue.begin();queue.erase(queue.begin());}Unlock();returnp;}TDataGetElement(intdd){if(dd==1)WaitQueueEvent();
4、TDatap;//=NULL;//vector::iteratorit;memset(&p,0,sizeof(TData));Lock();if(false==queue.empty()){p=*queue.begin();queue.erase(queue.begin());}Unlock();returnp;}private:/*操作之前加锁处理*/voidLock(){pthread_mutex_lock(&mutex);}/*操作之后解锁处理*/voidUnlock(){pthread_mutex_unlock(&mutex);}/*设置事件,触发线程中的处理*
5、/voidSetQueueEvent(){sem_post(&sem);}voidWaitQueueEvent(){#ifdefLINUX#undef_WITH_DBG#ifndef_WITH_DBGsem_wait(&sem);#elseintoldvalue=0;intnewvalue=0;do{sem_getvalue(&sem,&oldvalue);}while(oldvalue==0);while(1){sem_trywait(&sem);sem_getvalue(&sem,&newvalue);if(newvalue6、放队列,不释放数据?*/voidFreeQueue(){queue.clear();}};
6、放队列,不释放数据?*/voidFreeQueue(){queue.clear();}};
此文档下载收益归作者所有