实现一个消息队列
1、可以将消息以指针(指向基类)的方式存储在列表中;
2、指定消息类型会由基类派生模板进行处理
3、推送包装类的构造实例,以及存储指向这个实例的指针。
4、弹出实例的时候,将会返回其指针
5、因为message_base类没有任何成员函数,在访问存储消息之前,
1、可以将消息以指针(指向基类)的方式存储在列表中;
2、指定消息类型会由基类派生模板进行处理
3、推送包装类的构造实例,以及存储指向这个实例的指针。
4、弹出实例的时候,将会返回其指针
5、因为message_base类没有任何成员函数,在访问存储消息之前,
弹出线程就需要将指针转换为wrapped_message指针。
namespace messageing
{
class message_base
{
public:
virtual ~message_base()
{}
};
template<typename Msg>
class wrapped_message
{
public:
Msg _contents;
explicit wrapped_message(const Msg &content):
_contents(content)
{
}
}
class queue
{
public:
template<T>
void push(cont T &msg)
{
std::lock_guard<std::mutex>lk(mut);
qu.push(std::shared_ptr<wrapped_message<T>>(msg));
con.notify_one();
}
std::shared_ptr<message_base>wait_and_pop()
{
std::unique_lock<std::mutex>lk(mut);
con.wait(lk,[&]{return !qu.empty();});
auto res = qu.front();
qu.pop();
return res;
}
private:
std::mutex mut;
std::condition_any_variable con;
std::queue<std::shared_ptr<message_base>>qu;
}
}