template <typename T>
class Queue
{
private:
std::queue<T> q;
pthread_mutex_t q_mutex;
pthread_cond_t q_cond;
public:
Queue()
{
pthread_mutex_init(&q_mutex, NULL);
pthread_cond_init(&q_cond, NULL);
}
virtual ~Queue()
{
pthread_mutex_destroy(&q_mutex);
pthread_cond_destroy(&q_cond);
}
// 插入
void insert(const T& e)
{
pthread_mutex_lock(&q_mutex);
q.push(e);
pthread_cond_signal(&q_cond);
pthread_mutex_unlock(&q_mutex);
}
// 取数据,队列空则阻塞
void take(T& e)
{
pthread_mutex_lock(&q_mutex);
while(q.empty())
{
pthread_cond_wait(&q_cond, &q_mutex)
}
e = q.front();
q.pop();
pthread_mutex_unlock(&q_mutex);
}
// 取数据,队列空则返回
bool pull(T& e)
{
boot ret = false;
pthread_mutex_lock(&q_mutex);
while(!q.empty())
{
e = q.front();
q.pop();
ret = true;
}
pthread_mutex_unlock(&q_mutex);
return ret;
}
};