RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

利用C++提供的隊列封裝一個消息隊列

冬至子 ? 來源:嵌入式er日記 ? 作者:月下竹風 ? 2023-05-20 15:16 ? 次閱讀

最近的C++項目中,需要用到消息隊列,但是C++中又沒有原生的消息隊列,就在網(wǎng)上找了一下相關資料,利用C++提供的隊列,自己封裝一個消息隊列,以后的項目也可以復用。話不多說,下面開始。

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

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

1、接口定義

1.1、推送消息

將消息推送進消息隊列,并發(fā)送一次通知;

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、用到的對象(私有成員,用于功能的實現(xiàn))

2.1、隊列

使用隊列存放push進來的消息

#include 
  std::queue

2.2、條件變量

條件變量,用來實現(xiàn)消息的通知,push進來一個消息時,就會調(diào)一次notify

#include 
std::condition_variable cv_;

2.3、互斥量

提供給條件變量使用的,也用作資源保護

#include 
  std::mutex mutex_;

下面是實現(xiàn)的源碼:

使用模板的方式實現(xiàn)消息隊列,只需要一個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

運行結果:

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 封裝技術
    +關注

    關注

    12

    文章

    548

    瀏覽量

    67981
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6987
收藏 人收藏

    評論

    相關推薦

    FIFO隊列原理簡述

    FIFO是隊列機制中最簡單的,每個接口上只有FIFO隊列,表面上看FIFO隊列并沒有提供什么
    發(fā)表于 07-10 09:22 ?1656次閱讀

    Linux下進程通訊消息隊列

    進行通信。 消息隊列與 FIFO 很相似,都是隊列結構,都可以有多個進程往隊列里面寫信息,多個進程從
    的頭像 發(fā)表于 08-19 19:56 ?1814次閱讀
    Linux下進程通訊消息<b class='flag-5'>隊列</b>

    隊列C++中的queue詳解

    隊列就是種線性的數(shù)據(jù)結構,它與日常生活中排隊的隊列相似,即先進先出(LIFO, First In First Out),這點也是它與棧(Stack)的最大不同之處。
    的頭像 發(fā)表于 07-18 17:31 ?1658次閱讀
    <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的第
    發(fā)表于 04-02 14:45 ?684次閱讀

    淺談鴻蒙內(nèi)核代碼調(diào)度隊列

    鴻蒙內(nèi)核代碼中有兩源文件是關于隊列的,一個是用于調(diào)度的隊列,另一個是用于線程間通訊的IPC隊列
    的頭像 發(fā)表于 10-23 11:00 ?2010次閱讀

    深度解析數(shù)據(jù)結構與算法篇之隊列及環(huán)形隊列的實現(xiàn)

    的位置。 02 — 環(huán)形隊列的實現(xiàn) 要想將元素放入隊列我們必須知道對頭和隊尾,在隊列長度不能無限大的條件下我們還要知道隊列的最大容量,我們還想知道
    的頭像 發(fā)表于 06-18 10:07 ?1923次閱讀

    TencentOS-tiny中環(huán)形隊列的實現(xiàn)

    ; 隊尾指針(可變):永遠指向此隊列的最后數(shù)據(jù)元素; 隊列中的數(shù)據(jù)存儲方式有兩種: ① 基于靜態(tài)連續(xù)內(nèi)存(數(shù)組)存儲,如圖:② 基于動態(tài)內(nèi)存(鏈表節(jié)點)存儲,如圖: ? 后續(xù)都使用
    的頭像 發(fā)表于 10-08 16:30 ?1379次閱讀

    實現(xiàn)雙端隊列的步驟簡析

    隊列是非?;A且重要的數(shù)據(jù)結構,雙端隊列屬于隊列的升級。很多的算法都是基于隊列來實現(xiàn),例如搜索中的bfs,圖論中的spfa,計算幾何中的melkman等。
    的頭像 發(fā)表于 10-27 18:11 ?1440次閱讀

    SystemVerilog中的隊列

    隊列是大小可變的有序集合,隊列中元素必須是同一個類型的。隊列支持對其所有元素的訪問以及在隊列的開始或結束處插入和刪除。
    的頭像 發(fā)表于 10-31 10:09 ?4016次閱讀

    RTOS消息隊列的應用

    基于RTOS的應用中,通常使用隊列機制實現(xiàn)任務間的數(shù)據(jù)交互,應用程序可以有任意數(shù)量的消息隊列,每個消息隊列都有自己的用途。
    發(fā)表于 05-29 10:49 ?629次閱讀
    RTOS消息<b class='flag-5'>隊列</b>的應用

    FreeRTOS消息隊列結構體

    結構體用于描述隊列,叫做 Queue_t,這個結構體在文件 queue.c 中定義。 3、隊列創(chuàng)建 在使用
    的頭像 發(fā)表于 07-06 17:03 ?1094次閱讀
    FreeRTOS消息<b class='flag-5'>隊列</b>結構體

    雙端隊列C++ std::deque的用法說明

    雙端隊列實際上是隊列種變形,隊列要求只能在隊尾添加元素,在隊頭刪除元素,而雙端隊列在隊頭和隊尾都可以進行添加和刪除元素的操作。
    的頭像 發(fā)表于 07-18 17:43 ?620次閱讀
    雙端<b class='flag-5'>隊列</b>和<b class='flag-5'>C++</b> std::deque的用法說明

    棧實現(xiàn)隊列方法

    棧和隊列是比較基礎的數(shù)據(jù)結構。無論在工作中,還是在面試中,棧和隊列都用的比較多。在計算機的世界,你會看到隊列和棧,無處不在。 棧:先進后
    的頭像 發(fā)表于 10-08 15:54 ?801次閱讀

    消息隊列的發(fā)展歷史

    篇我們用秒殺案例探討了我們?yōu)槭裁葱枰?b class='flag-5'>隊列。今天我們來回顧下消息隊列的發(fā)展歷史。
    的頭像 發(fā)表于 10-30 10:49 ?1110次閱讀
    消息<b class='flag-5'>隊列</b>的發(fā)展歷史

    嵌入式環(huán)形隊列與消息隊列的實現(xiàn)原理

    嵌入式環(huán)形隊列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊列,是種先進先出(FIFO)的數(shù)據(jù)結構,用于在固定大小的存儲區(qū)域中高效地存儲和訪問數(shù)據(jù)。其主要特點包括固定大小的數(shù)組和兩指針(頭指針和尾指針
    的頭像 發(fā)表于 09-02 15:29 ?475次閱讀
    RM新时代网站-首页