最近的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文章
599瀏覽量
69260 -
C++語言
+關注
關注
0文章
147瀏覽量
7655
發布評論請先 登錄
相關推薦
熱點推薦
Linux 多線程同步-消息隊列
, size_t nbytes, long type, int flag ); a. type == 0; 返回消息隊列中第一個消息,先進先出 b. type > 0??? 返回消息隊列中類型為tpye的第
發表于 04-02 14:45
?928次閱讀
深度解析數據結構與算法篇之隊列及環形隊列的實現
的位置。 02 — 環形隊列的實現 要想將元素放入隊列我們必須知道對頭和隊尾,在隊列長度不能無限大的條件下我們還要知道隊列的最大容量,我們還想知道隊
TencentOS-tiny中環形隊列的實現
; 隊尾指針(可變):永遠指向此隊列的最后一個數據元素; 隊列中的數據存儲方式有兩種: ① 基于靜態連續內存(數組)存儲,如圖:② 基于動態內存(鏈表節點)存儲,如圖: ? 后續都使用
實現一個雙端隊列的步驟簡析
隊列是非?;A且重要的數據結構,雙端隊列屬于隊列的升級。很多的算法都是基于隊列來實現,例如搜索中的bfs,圖論中的spfa,計算幾何中的melkman等。
SystemVerilog中的隊列
隊列是大小可變的有序集合,隊列中元素必須是同一個類型的。隊列支持對其所有元素的訪問以及在隊列的開始或結束處插入和刪除。
RTOS消息隊列的應用
基于RTOS的應用中,通常使用隊列機制實現任務間的數據交互,一個應用程序可以有任意數量的消息隊列,每個消息隊列都有自己的用途。
發表于 05-29 10:49
?1128次閱讀
兩個棧實現一個隊列方法
棧和隊列是比較基礎的數據結構。無論在工作中,還是在面試中,棧和隊列都用的比較多。在計算機的世界,你會看到隊列和棧,無處不在。 棧:一個先進后
嵌入式環形隊列與消息隊列的實現原理
嵌入式環形隊列,也稱為環形緩沖區或循環隊列,是一種先進先出(FIFO)的數據結構,用于在固定大小的存儲區域中高效地存儲和訪問數據。其主要特點包括固定大小的數組和兩個指針(頭指針和尾指針
利用C++提供的隊列封裝一個消息隊列
評論