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

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

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

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

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

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

用到的對象: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、超時等待消息

這個方法也是同步的,不過可以設(shè)置超時時間,如果消息隊列是空的會阻塞,直到收到消息或達到超時時間,才會返回。

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

運行結(jié)果:

圖片

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

    關(guān)注

    12

    文章

    540

    瀏覽量

    67948
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6951
收藏 人收藏

    評論

    相關(guān)推薦

    FIFO隊列原理簡述

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

    Linux下進程通訊消息隊列

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

    隊列C++中的queue詳解

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

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

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

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

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

    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 ?1355次閱讀

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

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

    SystemVerilog中的隊列

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

    RTOS消息隊列的應(yīng)用

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

    FreeRTOS消息隊列結(jié)構(gòu)體

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

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

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

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

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

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

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

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

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