一个任务管理类的c++实现,可直接通过编译,目的:提高效率,防止频繁申请内存和释放

#include <iostream>
#include <pthread.h>
#include <semaphore.h>
#include <errno.h>
#include <queue>
using namespace std;
//注意以下两点,1:queue不提供迭代器,笔者第一次用queue,竟然想使用迭代的方法删除对象,
//至于为什么不提供迭代器,因为queue只提供顶端访问的功能,因此当然不提供遍历需要使用的迭代器了.
//2:sem_timedwait函数第二个参数的含义是时间戳。切记
//注:其中各种return可以用goto替换,加上日志打印,由于是demo,写的比较简单
//代码可直接通过编译

//用于内存管理,防止频繁申请和释放内存.
class task{

};
class Node{
public:
  Node(){} 
  ~Node(){
  
  }
  int Init(int MaxNum){
    for(int i = 0;i < MaxNum;++i){
      m_qtask.push(new task);
    }
    if(sem_init(&m_isEmpty,0,MaxNum) == -1){
      //log
      return -1;
    }
    if(pthread_mutex_init(&m_mutex,NULL) == -1){
      return -1;
    }
    return 0;
  }
  
  int push(task* p){
    pthread_mutex_lock(&m_mutex);
    sem_post(&m_isEmpty);
    m_qtask.push(p);
    pthread_mutex_unlock(&m_mutex);
  }
  int pop(task** p){
    int ret = 0;
    while(1){
      struct timespec ts;
      ts.tv_sec = time(NULL);
      ts.tv_nsec = 90909009;
      ret = sem_timedwait(&m_isEmpty,&ts);
      if(ret == -1){
        if(errno == EINTR)
          continue;
        else if(errno == ETIMEDOUT){
          //log 
          return -2;
        }
        else
          return -3;
        }else{
          break;
        }
    }
    pthread_mutex_lock(&m_mutex);
    *p = m_qtask.front();
    m_qtask.pop();
    pthread_mutex_unlock(&m_mutex);
    return 0;
  }
private:
  queue<task*> m_qtask;
  pthread_mutex_t m_mutex;
  sem_t m_isEmpty;
};
int main()
{
  Node node;
  node.Init(10);
}
 

猜你喜欢

转载自blog.csdn.net/wWX336815/article/details/83546360