#pragma once
#include <deque>
#include <condition_variable>
template <typename T>
class MsgList {
public:
void add(const T& msg)
{
std::unique_lock<std::mutex> lock(mutex);
queue.push_back(msg);
cond.notify_one();
}
T get()
{
std::unique_lock<std::mutex> lock(mutex);
while (queue.empty()){
cond.wait(lock);
}
T msg = queue.front();
queue.pop_front();
return msg;
}
bool get_noblock(T& msg)
{
std::unique_lock<std::mutex> lock(mutex);
if (!queue.empty())
{
msg = queue.front();
queue.pop_front();
return true;
}
else
{
return false;
}
}
int size()
{
std::unique_lock<std::mutex> lock(mutex);
return queue.size();
}
bool is_empty()
{
std::unique_lock<std::mutex> lock(mutex);
return queue.empty();
}
void clear()
{
std::unique_lock<std::mutex> lock(mutex);
queue.clear();
}
T at(int n)
{
return queue.at(n);
}
private:
std::deque<T> queue;
std::mutex mutex;
std::condition_variable cond;
};
使用:直接按双端队列的使用即可,在取数据可直接用循环取即可,无数据时或自动阻塞等待