0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用C++提供的队列封装一个消息队列

冬至子 来源:嵌入式er日记 作者:月下竹风 2023-05-20 15:16 次阅读

最近的C++项目中,需要用到消息队列,但是C++中又没有原生的消息队列,就在网上找了一下相关资料,利用C++提供的队列,自己封装一个消息队列,以后的项目也可以复用。话不多说,下面开始。

用到的对象:std::queue, std::condition_variable,std::mutex

提供的方法:push,poll,wait,wait_for

1、接口定义

1.1、推送消息

将消息推送进消息队列,并发送一次通知;

void push(const T &message)

1.2、轮询消息

从消息队列里取消息,无论消息队列里是否有消息,都立即返回。

/**
 * @return true get message success
 * @return false message queue is empty
 */
bool poll(T &message)

1.3、等待消息

这个方法是同步的,如果消息队列是空的,会一直阻塞在这里,直到接收到消息,才会返回。

void wait(T &message)

1.4、超时等待消息

这个方法也是同步的,不过可以设置超时时间,如果消息队列是空的会阻塞,直到收到消息或达到超时时间,才会返回。

std::cv_status wait_for(T &message, std::chrono::seconds timeOut)

2、用到的对象(私有成员,用于功能的实现)

2.1、队列

使用队列存放push进来的消息

#include 
  std::queue

2.2、条件变量

条件变量,用来实现消息的通知,push进来一个消息时,就会调一次notify

#include 
std::condition_variable cv_;

2.3、互斥量

提供给条件变量使用的,也用作资源保护

#include 
  std::mutex mutex_;

下面是实现的源码:

使用模板的方式实现消息队列,只需要一个hpp文件就可以了。

#ifndef __MESSAGE_QUEUE_HPP__
#define __MESSAGE_QUEUE_HPP__


#include 
#include 
#include 


template<class T>
class MessageQueue {
public:
  void push(const T &message) {
    std::lock_guard;
    queue_.push(message);
    cv_.notify_one();
  }
/**
 * @brief 
 * 
 * @param message 
 * @return true 
 * @return false 
 */
  bool poll(T &message) {
    bool ret = false;
    std::lock_guard;
    if (queue_.size()) {
      message = queue_.front();
      queue_.pop();
      ret = true;
    }
    return ret;
  }


  void wait(T &message) {
    std::unique_lock;
    while (!queue_.size()) {
      cv_.wait(lock);
    }
    message = queue_.front();
    queue_.pop();
  }


  std::cv_status wait_for(T &message, std::chrono::seconds timeOut) {
    std::cv_status status(std::cv_status::no_timeout);
    std::unique_lock;
    if (!queue_.size()) {
      status = cv_.wait_for(lock, timeOut);
    }


    if (std::cv_status::timeout != status) {
      message = queue_.front();
      queue_.pop();
    }
    return status;
  }


  size_t size(void) {
    std::lock_guard;
    return queue_.size();
  }


private:
  std::queue

3、测试验证

下面写一个测试用例:

#include "message_queue.hpp"
#include 
#include 
#include 


typedef struct  {
    int flag;
} Message;


int main(int argc, char *argv[]) {
    MessageQueue

编译命令:

g++  testmessage.cpp -lpthread

运行结果:

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装技术
    +关注

    关注

    12

    文章

    495

    浏览量

    67786
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
收藏 人收藏

    评论

    相关推荐

    FIFO队列原理简述

    FIFO是队列机制中最简单的,每个接口上只有一个FIFO队列,表面上看FIFO队列并没有提供什么QoS保证,甚至很多人认为FIFO严格意义上不算做一种
    发表于 07-10 09:22 1394次阅读

    Linux下进程通讯消息队列

     MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已。MQ 是在消息的传输过程中保存消息的容器。多用于分布式系统之间
    的头像 发表于 08-19 19:56 1510次阅读
    Linux下进程通讯消息<b class='flag-5'>队列</b>

    队列C++中的queue详解

    队列就是一种线性的数据结构,它与日常生活中排队的队列相似,即先进先出(LIFO, First In First Out),这点也是它与栈(Stack)的最大不同之处。
    的头像 发表于 07-18 17:31 751次阅读
    <b class='flag-5'>队列</b>与<b class='flag-5'>C++</b>中的queue详解

    测试UCOSII消息队列发现BUG

    最近在测试UCOSII的消息队列的时候发现bug。我定义消息指针数据和
    发表于 03-16 01:57

    利用CAS技术实现无锁队列

    【 导读 】:本文 主要讲解利用CAS技术实现无锁队列。 关于无锁队列的实现,网上有很多文章,虽然本文可能和那些文章有所重复,但是我还是想以我自己的方式把这些文章中的重要的知识点串起来和大家讲一讲
    的头像 发表于 01-11 10:52 2004次阅读
    <b class='flag-5'>利用</b>CAS技术实现无锁<b class='flag-5'>队列</b>

    深度解析数据结构与算法篇之队列及环形队列的实现

    01 — 队列简介 队列是种先进先出的数据结构,有个元素进入队列称为入对(enqueue),删除元素称为出队(dequeue),队列有对头(head)和对尾(tail),当有元素进入
    的头像 发表于 06-18 10:07 1641次阅读

    队列Queue的常用方法有哪些

    FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。
    的头像 发表于 08-19 10:24 5146次阅读
    <b class='flag-5'>队列</b>Queue的常用方法有哪些

    实现一个双端队列的步骤简析

    队列是非常基础且重要的数据结构,双端队列属于队列的升级。很多的算法都是基于队列来实现,例如搜索中的bfs,图论中的spfa,计算几何中的melkman等。
    的头像 发表于 10-27 18:11 1086次阅读

    SystemVerilog中的队列

    队列是大小可变的有序集合,队列中元素必须是同一个类型的。队列支持对其所有元素的访问以及在队列的开始或结束处插入和删除。
    的头像 发表于 10-31 10:09 3065次阅读

    什么是消息队列?消息队列中间件重要吗?

    应用解耦:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节。
    的头像 发表于 11-07 14:55 1028次阅读

    嵌入式环形队列和消息队列的实现

    嵌入式环形队列和消息队列是实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    的头像 发表于 04-14 11:52 1058次阅读

    RTOS消息队列的应用

    基于RTOS的应用中,通常使用队列机制实现任务间的数据交互,一个应用程序可以有任意数量的消息队列,每个消息队列都有自己的用途。
    发表于 05-29 10:49 426次阅读
    RTOS消息<b class='flag-5'>队列</b>的应用

    FreeRTOS消息队列介绍

    队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做
    的头像 发表于 07-06 16:58 489次阅读
    FreeRTOS消息<b class='flag-5'>队列</b>介绍

    双端队列C++ std::deque的用法说明

    双端队列实际上是队列的一种变形,队列要求只能在队尾添加元素,在队头删除元素,而双端队列在队头和队尾都可以进行添加和删除元素的操作。
    的头像 发表于 07-18 17:43 400次阅读
    双端<b class='flag-5'>队列</b>和<b class='flag-5'>C++</b> std::deque的用法说明

    无锁队列解决的问题

    为什么需要无锁队列 无锁队列解决了什么问题?无锁队列解决了锁引起的问题。 cache失效 当CPU要访问主存的时候,这些数据首先要被copy到cache中,因为这些数据在不久的将来可能又会被处理器
    的头像 发表于 11-10 15:33 264次阅读
    无锁<b class='flag-5'>队列</b>解决的问题