在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    549

    瀏覽量

    67990
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6992
收藏 人收藏

    評論

    相關推薦

    FIFO隊列原理簡述

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

    Linux下進程通訊消息隊列

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

    隊列C++中的queue詳解

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

    淺談鴻蒙內核代碼調度隊列

    鴻蒙內核代碼中有兩源文件是關于隊列的,一個是用于調度的隊列,另一個是用于線程間通訊的IPC隊列
    的頭像 發表于 10-23 11:00 ?2023次閱讀

    深度解析數據結構與算法篇之隊列及環形隊列的實現

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

    TencentOS-tiny中環形隊列的實現

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

    實現雙端隊列的步驟簡析

    隊列是非常基礎且重要的數據結構,雙端隊列屬于隊列的升級。很多的算法都是基于隊列來實現,例如搜索中的bfs,圖論中的spfa,計算幾何中的melkman等。
    的頭像 發表于 10-27 18:11 ?1450次閱讀

    SystemVerilog中的隊列

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

    RTOS消息隊列的應用

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

    FreeRTOS消息隊列結構體

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

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

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

    棧實現隊列方法

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

    消息隊列的發展歷史

    篇我們用秒殺案例探討了我們為什么需要消息隊列。今天我們來回顧下消息隊列的發展歷史。
    的頭像 發表于 10-30 10:49 ?1139次閱讀
    消息<b class='flag-5'>隊列</b>的發展歷史

    嵌入式環形隊列與消息隊列的實現原理

    嵌入式環形隊列,也稱為環形緩沖區或循環隊列,是種先進先出(FIFO)的數據結構,用于在固定大小的存儲區域中高效地存儲和訪問數據。其主要特點包括固定大小的數組和兩指針(頭指針和尾指針
    的頭像 發表于 09-02 15:29 ?517次閱讀
    主站蜘蛛池模板: 欧美资源在线 | 天天操伊人| 黄视频免费网站 | 四虎成人精品在永久在线观看 | 日本xxxx色视频在线观看免费 | 国产高清精品自在久久 | 精品久久久久久国产免费了 | 免费黄色在线视频 | 国产亚洲精品aa在线观看 | 美女被羞羞产奶视频网站 | 奇米影视一区二区三区 | 色天天色综合 | 天堂资源地址在线 | 久久久噜噜噜久久网 | 国内精品久久久久影院薰衣草 | 一级片a| 日本不卡在线一区二区三区视频 | 91亚洲国产成人久久精品网站 | 久久久这里有精品999 | 六月丁香激情综合成人 | 99 久久99久久精品免观看 | 2019天天操夜夜操 | 井野雏田小樱天天被调教 | 久久综合九色 | 精品国产一区二区三区成人 | 天天干天天操天天爱 | 成人夜色香网站在线观看 | 欧美另类高清 | 欧美人与动性视频在线观 | 1024你懂的在线观看 | 手机在线视频观看 | 国产天天操 | 天天做天天爱夜夜大爽完整 | 国产性videosgratis | 伊人一区二区三区 | 亚洲人成电影院 | 我不卡老子影院午夜伦我不卡四虎 | 人人舔 | 三级天堂 | 五月婷婷六月色 | 看真人一一级毛片 |