消息队列   
               添加时间:2013-6-6 点击量: 
 
              一个哄骗前提变量写的消息队列,基于双缓冲的,固然比拟三缓冲的差距不小,然则还是值得拿来进修一下前提变量。
/
  BufQueue.h
 
   Created on: May 30, 2013
       Author: archy_yu
 /
#ifndef BUFQUEUE_H_
#define BUFQUEUE_H_
#include <list>
#include <pthread.h>
//#include CommonStruct.h
typedef  void CommonItem;
#define BATPROCESS_NUM 5
class BufQueue
{
public:
    BufQueue();
    virtual ~BufQueue();
    int peek(CommonItem &item);
    int append(CommonItem item);
    std::list<CommonItem> serial_read(std::list<CommonItem> inlist);
    int set_read_event();
    void WaitReadEventByTimeOut(bool& isReadable);
private:
    std::list<CommonItem> _write_list;
    std::list<CommonItem> _read_list;
    pthread_mutex_t _write_mutex;
    pthread_mutex_t _read_mutex;
    pthread_cond_t _read_cond;
};
#endif / BUFQUEUE_H_ /
/
  BufQueue.cpp
 
   Created on: May 30, 2013
       Author: archy_yu
 /
#include BufQueue.h
#include <sys/time.h>
#include <time.h>
void maketimeout(struct timespec tsp,long ns = 1)
{
    struct timeval now;
    //get the current time
    gettimeofday(&now,0);
    tsp->tv_sec = now.tv_sec;
    tsp->tv_nsec = now.tv_usec  1000;  //usec to nsec
    tsp->tv_nsec += 1000ns;
}
CommonItem PopMsgToPutFromList( std::list<CommonItem> pList )
{
    if(pList == NULL)
    {
        return NULL;
    }
    if(pList->empty())
    {
        return NULL;
    }
    else
    {
        CommonItem item = pList->front();
        pList->pop_front();
        return item;
    }
}
BufQueue::BufQueue()
{
    pthread_mutex_init(&this->_write_mutex,NULL);
    pthread_mutex_init(&this->_read_mutex,NULL);
    pthread_cond_init(&this->_read_cond,NULL);
    this->_read_list = new std::list<CommonItem>();
    this->_write_list = new std::list<CommonItem>();
}
BufQueue::~BufQueue()
{
    pthread_mutex_destroy(&this->_write_mutex);
    pthread_mutex_destroy(&this->_read_mutex);
    pthread_cond_destroy(&this->_read_cond);
    this->_read_list->clear();
    this->_write_list->clear();
}
int BufQueue::peek(CommonItem &item)
{
    pthread_mutex_lock(&this->_write_mutex);
    item = PopMsgToPutFromList(this->_read_list);
    pthread_mutex_unlock(&this->_write_mutex);
    return 0;
}
int BufQueue::append(CommonItem item)
{
    if(item == NULL)
    {
        return 0;
    }
    bool issetread = false;
    pthread_mutex_lock(&this->_write_mutex);
    this->_write_list->push_back(item);
    issetread = (this->_write_list->size() > BATPROCESS_NUM);
    pthread_mutex_unlock(&this->_write_mutex);
    if(issetread)
    {
        this->set_read_event();
    }
    return 0;
}
std::list<CommonItem> BufQueue::serial_read(std::list<CommonItem> inQueue)
{
    pthread_mutex_lock(&this->_write_mutex);
    std::list<CommonItem> tmplist = this->_write_list;
    this->_write_list = this->_read_list;
    this->_read_list = tmplist;
    tmplist = this->_read_list;
    this->_read_list = inQueue;
    pthread_mutex_unlock(&this->_write_mutex);
    return tmplist;
}
int BufQueue::set_read_event()
{
    pthread_mutex_lock(&this->_read_mutex);
    pthread_cond_signal(&this->_read_cond);
    pthread_mutex_unlock(&this->_read_mutex);
    return 0;
}
void BufQueue::WaitReadEventByTimeOut(bool& isReadable)
{
    pthread_mutex_lock(&this->_read_mutex);
    struct timespec ts;
    maketimeout(&ts,0);
    isReadable = (0 == pthread_cond_timedwait(&this->_read_cond,&this->_read_mutex, &ts));
    pthread_mutex_unlock(&this->_read_mutex);
}
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
                     
                  
     
  
 
    
    
一个哄骗前提变量写的消息队列,基于双缓冲的,固然比拟三缓冲的差距不小,然则还是值得拿来进修一下前提变量。
/
BufQueue.h
Created on: May 30, 2013
Author: archy_yu
/
#ifndef BUFQUEUE_H_
#define BUFQUEUE_H_
#include <list>
#include <pthread.h>
//#include CommonStruct.h
typedef void CommonItem;
#define BATPROCESS_NUM 5
class BufQueue
{
public:
BufQueue();
virtual ~BufQueue();
int peek(CommonItem &item);
int append(CommonItem item);
std::list<CommonItem> serial_read(std::list<CommonItem> inlist);
int set_read_event();
void WaitReadEventByTimeOut(bool& isReadable);
private:
std::list<CommonItem> _write_list;
std::list<CommonItem> _read_list;
pthread_mutex_t _write_mutex;
pthread_mutex_t _read_mutex;
pthread_cond_t _read_cond;
};
#endif / BUFQUEUE_H_ /
/
BufQueue.cpp
Created on: May 30, 2013
Author: archy_yu
/
#include BufQueue.h
#include <sys/time.h>
#include <time.h>
void maketimeout(struct timespec tsp,long ns = 1)
{
struct timeval now;
//get the current time
gettimeofday(&now,0);
tsp->tv_sec = now.tv_sec;
tsp->tv_nsec = now.tv_usec 1000; //usec to nsec
tsp->tv_nsec += 1000ns;
}
CommonItem PopMsgToPutFromList( std::list<CommonItem> pList )
{
if(pList == NULL)
{
return NULL;
}
if(pList->empty())
{
return NULL;
}
else
{
CommonItem item = pList->front();
pList->pop_front();
return item;
}
}
BufQueue::BufQueue()
{
pthread_mutex_init(&this->_write_mutex,NULL);
pthread_mutex_init(&this->_read_mutex,NULL);
pthread_cond_init(&this->_read_cond,NULL);
this->_read_list = new std::list<CommonItem>();
this->_write_list = new std::list<CommonItem>();
}
BufQueue::~BufQueue()
{
pthread_mutex_destroy(&this->_write_mutex);
pthread_mutex_destroy(&this->_read_mutex);
pthread_cond_destroy(&this->_read_cond);
this->_read_list->clear();
this->_write_list->clear();
}
int BufQueue::peek(CommonItem &item)
{
pthread_mutex_lock(&this->_write_mutex);
item = PopMsgToPutFromList(this->_read_list);
pthread_mutex_unlock(&this->_write_mutex);
return 0;
}
int BufQueue::append(CommonItem item)
{
if(item == NULL)
{
return 0;
}
bool issetread = false;
pthread_mutex_lock(&this->_write_mutex);
this->_write_list->push_back(item);
issetread = (this->_write_list->size() > BATPROCESS_NUM);
pthread_mutex_unlock(&this->_write_mutex);
if(issetread)
{
this->set_read_event();
}
return 0;
}
std::list<CommonItem> BufQueue::serial_read(std::list<CommonItem> inQueue)
{
pthread_mutex_lock(&this->_write_mutex);
std::list<CommonItem> tmplist = this->_write_list;
this->_write_list = this->_read_list;
this->_read_list = tmplist;
tmplist = this->_read_list;
this->_read_list = inQueue;
pthread_mutex_unlock(&this->_write_mutex);
return tmplist;
}
int BufQueue::set_read_event()
{
pthread_mutex_lock(&this->_read_mutex);
pthread_cond_signal(&this->_read_cond);
pthread_mutex_unlock(&this->_read_mutex);
return 0;
}
void BufQueue::WaitReadEventByTimeOut(bool& isReadable)
{
pthread_mutex_lock(&this->_read_mutex);
struct timespec ts;
maketimeout(&ts,0);
isReadable = (0 == pthread_cond_timedwait(&this->_read_cond,&this->_read_mutex, &ts));
pthread_mutex_unlock(&this->_read_mutex);
}
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》




