#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);
}