转|C++标准库队列queue

在编写“生产者---消费者”模式的代码时需要用到消息队列,由于代码量比较小,就使用C++标准库队列queue扩展编写了一个队列类,在queue各个方法的基础上添加了互斥锁,写在一个头文件中即可,全部代码如下:

 


   
   
  1. #pragma once
  2. #include <iostream>
  3. #include <queue>
  4. #include <mutex>
  5. template < typename T_Struct>
  6. class QueueData
  7. {
  8. private:
  9. std::mutex mutex_qData;
  10. std::queue<T_Struct> qData;
  11. public:
  12. QueueData( /* args */){};
  13. ~ QueueData(){};
  14. bool qData_IsEmpty() //判断d队列是否为空
  15. {
  16. std::lock_guard<std::mutex> lock_qData(this->mutex_qData);
  17. return this->qData. empty();
  18. }
  19. T_Struct qData_Front() //返回队列中第一个元素,即最早被压入队列的元素
  20. {
  21. std::lock_guard<std::mutex> lock_qData(this->mutex_qData);
  22. return this->qData. front();
  23. }
  24. T_Struct qData_Back() //返回队列中第一个元素,即最早被压入队列的元素
  25. {
  26. std::lock_guard<std::mutex> lock_qData(this->mutex_qData);
  27. return this->qData. back();
  28. }
  29. void qData_Push(const T_Struct &data) //入队,在队列末尾加入一个元素
  30. {
  31. std::lock_guard<std::mutex> lock_qData(this->mutex_qData);
  32. qData. push(data);
  33. }
  34. void qData_Pop() //出队,弹出即去除队列的第一个元素即最早被压入队列的元素
  35. {
  36. std::lock_guard<std::mutex> lock_qData(this->mutex_qData);
  37. this->qData. pop();
  38. }
  39. int qData_Size() //返回队列中元素的个数,即队列的长度
  40. {
  41. std::lock_guard<std::mutex> lock_qData(this->mutex_qData);
  42. return this->qData. size();
  43. }
  44. void qData_Clear()
  45. {
  46. std::lock_guard<std::mutex> lock_qData(this->mutex_qData);
  47. for ( size_t i = 0; i < this->qData. size(); i++)
  48. {
  49. this->qData. pop();
  50. }
  51. }
  52. };

 

 

 

注释:在多线程之间使用生产者消费者模型,boost::lockfree::queue可以安全使用,但使用std::queue需要与std::mutex一起使用,保证线程安全。之前调试失败因为只注重pop和push时的mutex锁,但isempty和其他的操作其实都需要加锁的,按如上所示代码可以正常运行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值