最近的C++項(xiàng)目中,需要用到消息隊(duì)列,但是C++中又沒有原生的消息隊(duì)列,就在網(wǎng)上找了一下相關(guān)資料,利用C++提供的隊(duì)列,自己封裝一個(gè)消息隊(duì)列,以后的項(xiàng)目也可以復(fù)用。話不多說,下面開始。
用到的對象:std::queue, std::condition_variable,std::mutex
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é)果:
-
封裝技術(shù)
+關(guān)注
關(guān)注
12文章
553瀏覽量
68037 -
C++語言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7027
發(fā)布評論請先 登錄
相關(guān)推薦
FIFO隊(duì)列原理簡述
Linux下進(jìn)程通訊消息隊(duì)列
![Linux下進(jìn)程通訊消息<b class='flag-5'>隊(duì)列</b>](https://file.elecfans.com//web2/M00/63/9F/pYYBAGL_eXuABxWmAAeJ5O7XsAY981.png)
隊(duì)列與C++中的queue詳解
![<b class='flag-5'>隊(duì)列</b>與<b class='flag-5'>C++</b>中的queue詳解](https://file1.elecfans.com/web2/M00/8D/15/wKgZomS2W8uASNbyAABUlE8q2mI169.jpg)
Linux 多線程同步-消息隊(duì)列
淺談鴻蒙內(nèi)核代碼調(diào)度隊(duì)列
深度解析數(shù)據(jù)結(jié)構(gòu)與算法篇之隊(duì)列及環(huán)形隊(duì)列的實(shí)現(xiàn)
TencentOS-tiny中環(huán)形隊(duì)列的實(shí)現(xiàn)
實(shí)現(xiàn)一個(gè)雙端隊(duì)列的步驟簡析
SystemVerilog中的隊(duì)列
RTOS消息隊(duì)列的應(yīng)用
![RTOS消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用](https://file1.elecfans.com/web2/M00/88/CB/wKgaomR0E0WAGaiCAAAZvY_r7Cs460.png)
FreeRTOS消息隊(duì)列結(jié)構(gòu)體
![FreeRTOS消息<b class='flag-5'>隊(duì)列</b>結(jié)構(gòu)體](https://file1.elecfans.com/web2/M00/8C/25/wKgZomSmgl-AcSSKAAGgaqoknww761.jpg)
雙端隊(duì)列和C++ std::deque的用法說明
![雙端<b class='flag-5'>隊(duì)列</b>和<b class='flag-5'>C++</b> std::deque的用法說明](https://file1.elecfans.com/web2/M00/8D/15/wKgaomS2XqaACLDDAAA6NhJI_4E664.jpg)
兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列方法
消息隊(duì)列的發(fā)展歷史
![消息<b class='flag-5'>隊(duì)列</b>的發(fā)展歷史](https://file1.elecfans.com/web2/M00/AB/42/wKgaomU_GjOARrIoAAAcxWFewsg975.png)
評論