并发与多线程之实战一

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值