在线观看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次閱讀
    主站蜘蛛池模板: 日韩免费在线视频| 亚洲人在线| 性色aⅴ闺蜜一区二区三区| 你懂的网站在线播放| 夜夜艹| 午夜欧美性视频在线播放| 一级做a爰片久久毛片免费看| 免播放器av少妇影院| 国产成 人 综合 亚洲网| 日本aaaaa毛片动漫| 深夜动态福利gif进出粗暴| 国产精品三级a三级三级午夜| 欧美精品hdvideosex| 天天干夜夜谢| 免费精品美女久久久久久久久久 | 日韩免费高清一级毛片在线| a理论片| 国产黄在线观看| 色多多a| 精品四虎免费观看国产高清午夜| 人人做人人爽国产视| 福利视频第一区| 黄色大片三级| 201天天爱天天做| 色色色色色色网| 午夜精品视频在线看| 乱小说录目伦200篇将曲勒| 六月婷婷网视频在线观看| 苦瓜se影院在线视频网站| 一级做性色a爱片久久片| 成年男人永久免费看片| 免费超爽视频| 亚洲三级电影在线播放| 成人99| 中文字幕一区二区三区四区五区| 亚洲成a人v在线观看| 最近高清在线视频观看免费| 综合7799亚洲伊人爱爱网| 日韩免费一级毛片| 久久国产免费| 四虎影院欧美|