最近的C++項目中,需要用到消息隊列,但是C++中又沒有原生的消息隊列,就在網上找了一下相關資料,利用C++提供的隊列,自己封裝一個消息隊列,以后的項目也可以復用。話不多說,下面開始。
用到的對象:std::queue, std::condition_variable,std::mutex
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
發布評論請先 登錄
相關推薦
評論