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

    文章

    544

    浏览量

    67959
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6968
收藏 人收藏

    评论

    相关推荐

    FIFO队列原理简述

    FIFO是队列机制中最简单的,每个接口上只有FIFO队列,表面上看FIFO队列并没有提供什么
    发表于 07-10 09:22 1633次阅读

    Linux下进程通讯消息队列

    进行通信。 消息队列与 FIFO 很相似,都是队列结构,都可以有多个进程往队列里面写信息,多个进程从
    的头像 发表于 08-19 19:56 1785次阅读
    Linux下进程通讯消息<b class='flag-5'>队列</b>

    队列C++中的queue详解

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

    Linux 多线程同步-消息队列

    , size_t nbytes, long type, int flag );  a. type == 0; 返回消息队列中第一个消息,先进先出  b. type > 0    返回消息队列中类型为tpye的第
    发表于 04-02 14:45 677次阅读

    浅谈鸿蒙内核代码调度队列

    鸿蒙内核代码中有两源文件是关于队列的,一个是用于调度的队列,另一个是用于线程间通讯的IPC队列
    的头像 发表于 10-23 11:00 1997次阅读

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

    的位置。 02 — 环形队列的实现 要想将元素放入队列我们必须知道对头和队尾,在队列长度不能无限大的条件下我们还要知道队列的最大容量,我们还想知道
    的头像 发表于 06-18 10:07 1893次阅读

    TencentOS-tiny中环形队列的实现

    ; 队尾指针(可变):永远指向此队列的最后数据元素; 队列中的数据存储方式有两种: ① 基于静态连续内存(数组)存储,如图:② 基于动态内存(链表节点)存储,如图: ❝ 后续都使用
    的头像 发表于 10-08 16:30 1359次阅读

    实现双端队列的步骤简析

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

    SystemVerilog中的队列

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

    RTOS消息队列的应用

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

    FreeRTOS消息队列结构体

    结构体用于描述队列,叫做 Queue_t,这个结构体在文件 queue.c 中定义。 3、队列创建 在使用
    的头像 发表于 07-06 17:03 1041次阅读
    FreeRTOS消息<b class='flag-5'>队列</b>结构体

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

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

    栈实现队列方法

    栈和队列是比较基础的数据结构。无论在工作中,还是在面试中,栈和队列都用的比较多。在计算机的世界,你会看到队列和栈,无处不在。 栈:先进后
    的头像 发表于 10-08 15:54 777次阅读

    消息队列的发展历史

    篇我们用秒杀案例探讨了我们为什么需要消息队列。今天我们来回顾下消息队列的发展历史。
    的头像 发表于 10-30 10:49 1031次阅读
    消息<b class='flag-5'>队列</b>的发展历史

    嵌入式环形队列与消息队列的实现原理

    嵌入式环形队列,也称为环形缓冲区或循环队列,是种先进先出(FIFO)的数据结构,用于在固定大小的存储区域中高效地存储和访问数据。其主要特点包括固定大小的数组和两指针(头指针和尾指针
    的头像 发表于 09-02 15:29 321次阅读