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