1. 程式人生 > >一個任務管理類的c++實現,可直接通過編譯,目的:提高效率,防止頻繁申請記憶體和釋放

一個任務管理類的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);
}