吴忠躺衫网络科技有限公司

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

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

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

利用C++提供的隊(duì)列封裝一個(gè)消息隊(duì)列

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

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

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

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

1、接口定義

1.1、推送消息

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

void push(const T &message)

1.2、輪詢消息

從消息隊(duì)列里取消息,無論消息隊(duì)列里是否有消息,都立即返回。

/**
 * @return true get message success
 * @return false message queue is empty
 */
bool poll(T &message)

1.3、等待消息

這個(gè)方法是同步的,如果消息隊(duì)列是空的,會(huì)一直阻塞在這里,直到接收到消息,才會(huì)返回。

void wait(T &message)

1.4、超時(shí)等待消息

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

std::cv_status wait_for(T &message, std::chrono::seconds timeOut)

2、用到的對象(私有成員,用于功能的實(shí)現(xiàn))

2.1、隊(duì)列

使用隊(duì)列存放push進(jìn)來的消息

#include 
  std::queue

2.2、條件變量

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

#include 
std::condition_variable cv_;

2.3、互斥量

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

#include 
  std::mutex mutex_;

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

使用模板的方式實(shí)現(xiàn)消息隊(duì)列,只需要一個(gè)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、測試驗(yàn)證

下面寫一個(gè)測試用例:

#include "message_queue.hpp"
#include 
#include 
#include 


typedef struct  {
    int flag;
} Message;


int main(int argc, char *argv[]) {
    MessageQueue

編譯命令:

g++  testmessage.cpp -lpthread

運(yùn)行結(jié)果:

圖片

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

    關(guān)注

    12

    文章

    553

    瀏覽量

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

    關(guān)注

    0

    文章

    147

    瀏覽量

    7027
收藏 人收藏

    評論

    相關(guān)推薦

    FIFO隊(duì)列原理簡述

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

    Linux下進(jìn)程通訊消息隊(duì)列

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

    隊(duì)列C++中的queue詳解

    隊(duì)列就是種線性的數(shù)據(jù)結(jié)構(gòu),它與日常生活中排隊(duì)的隊(duì)列相似,即先進(jìn)先出(LIFO, First In First Out),這點(diǎn)也是它與棧(Stack)的最大不同之處。
    的頭像 發(fā)表于 07-18 17:31 ?1780次閱讀
    <b class='flag-5'>隊(duì)列</b>與<b class='flag-5'>C++</b>中的queue詳解

    Linux 多線程同步-消息隊(duì)列

    , size_t nbytes, long type, int flag );  a. type == 0; 返回消息隊(duì)列中第一個(gè)消息,先進(jìn)先出  b. type > 0??? 返回消息隊(duì)列中類型為tpye的第
    發(fā)表于 04-02 14:45 ?699次閱讀

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

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

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

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

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

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

    實(shí)現(xiàn)個(gè)雙端隊(duì)列的步驟簡析

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

    SystemVerilog中的隊(duì)列

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

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

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

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

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

    雙端隊(duì)列C++ std::deque的用法說明

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

    個(gè)棧實(shí)現(xiàn)個(gè)隊(duì)列方法

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

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

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

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

    嵌入式環(huán)形隊(duì)列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊(duì)列,是種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲(chǔ)區(qū)域中高效地存儲(chǔ)和訪問數(shù)據(jù)。其主要特點(diǎn)包括固定大小的數(shù)組和兩個(gè)指針(頭指針和尾指針
    的頭像 發(fā)表于 09-02 15:29 ?657次閱讀
    百家乐官网赢钱绝技| 百家乐玩法及细则| 威尼斯人娱乐城 活动| 真钱百家乐官网游戏排行| 太阳城百家乐试玩优惠| 百家乐怎么玩| 新濠百家乐现金网| 皇星娱乐城| 百家乐是咋玩法| 银河国际娱乐场| 百家乐官网庄最高连开几把| 娱乐城注册送18元| 保单百家乐路单| 邵东县| 游戏百家乐庄闲| 石楼县| 好望角百家乐的玩法技巧和规则 | 威尼斯人娱乐城优惠活动| 百家乐官网投注系统| 百家乐冼牌机| 真人百家乐官网对决| 钱大发888斗地主| 新世纪百家乐官网的玩法技巧和规则| 大发888登录网页游戏| 百家乐官网冼牌机| 班玛县| 澳门百家乐十大缆| 新葡京百家乐官网现金网| 找真人百家乐的玩法技巧和规则| 波音百家乐官网自动投注| 赌百家乐到底能赌博赢| 百家乐官网视频台球游戏| 威尼斯人娱乐场网站| 上海百家乐官网的玩法技巧和规则 | 同花顺百家乐的玩法技巧和规则 | 百家乐官网赌博机吧| 南宁百家乐的玩法技巧和规则| 百家乐官网平注法攻略| 六合彩网页| 百家乐桌布9人| 百家乐官网庄闲路|