并发与多线程之实战一

实现一个消息队列
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;
	}
}

猜你喜欢

转载自blog.csdn.net/wymtqq/article/details/80142810