亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++實現一個簡單消息隊列的示例詳解

 更新時間:2022年12月15日 11:02:57   作者:CodeOfCC  
消息隊列在多線程的場景有時會用到,尤其是線程通信跨線程調用的時候,就可以使用消息隊列進行通信。本文將利用C++實現一個簡單的消息隊列,感興趣的可以了解一下

前言

消息隊列在多線程的場景有時會用到,尤其是線程通信跨線程調用的時候,就可以使用消息隊列進行通信。C++實現一個能用的消息隊列還是比較簡單的,只需要一個隊列一個互斥變量和一個條件變量,這些在標準庫中都有提供?;谠泴戇^的項目,總結出來最簡單的消息隊列的實現將在下文中介紹。

一、如何實現

1、接口定義

一個基本的消息隊列只需要3個接口:

(1)推送消息

推送消息即是將消息寫入隊列,這個通常采用異步實現,推送之后立刻返回。如果要實現Windows的SendMessage則會比較復雜,最好的方式是放到外部實現,消息隊列只提供異步推送消息。

void push(const T& msg);    

(2)等待消息

等待隊列的消息,這個方法是同步的,只有接收到消息才會返回。

//等待消息
void wait(T& msg);

(3)輪詢消息

輪詢消息和等待消息一樣也是接收消息,只是無論是否接收到消息輪詢消息會立刻返回。輪詢消息也是有一定的使用場景,尤其是接收消息線程需要一定的調度邏輯時就需要輪詢消息避免線程堵塞。

bool poll(T& msg);

2、用到的對象

(1)隊列

我們使用一個隊列來存放消息

#include<queue>
std::queue<T> _queue;

(2)互斥變量

使用一個互斥變量確保隊列的讀寫線程安全

#include<mutex>
std::mutex _mtx;

(3)條件變量

采用條件變量結合互斥變量實現消息的等待和通知。

#include<condition_variable>
std::condition_variable _cv;

3、基本流程

線程通信

二、完整代碼

采用泛型實現,消息類型可以自定義。

#include<mutex>
#include<condition_variable>
#include<queue>
/// <summary>
/// 消息隊列
/// </summary>
/// <typeparam name="T">消息類型</typeparam>
template<class T> class MessageQueue {
public:
    /// <summary>
    /// 推入消息
    /// </summary>
    /// <param name="msg">消息對象</param>
    void push(const T& msg) {
        std::unique_lock<std::mutex>lck(_mtx);
        _queue.push(msg);
        _cv.notify_one();
    }
    /// <summary>
    /// 輪詢消息
    /// </summary>
    /// <param name="msg">消息對象</param>
    /// <returns>是否接收到消息</returns>
    bool poll(T& msg) {
        std::unique_lock<std::mutex>lck(_mtx);
        if (_queue.size())
        {
            msg = _queue.front();
            _queue.pop();
            return true;
        }
        return false;
    }
    /// <summary>
    /// 等待消息
    /// </summary>
    /// <param name="msg">消息對象</param>
    void wait(T& msg) {
        std::unique_lock<std::mutex>lck(_mtx);
        while (!_queue.size()) _cv.wait(lck);
        msg = _queue.front();
        _queue.pop();
    }
    //隊列長度
    size_t size() {
        std::unique_lock<std::mutex>lck(_mtx);
        return _queue.size();
    }
private:
    //隊列
    std::queue<T> _queue;
    //互斥變量
    std::mutex _mtx;
    //條件變量
    std::condition_variable _cv;
};

三、使用示例

線程通信

等待消息

#include<thread>
//自定義消息對象
class MyMessage {
public:
    int type;
    void* param1;
    void* param2;
};
int main(int argc, char* argv[])
{
    //初始化消息隊列
    MessageQueue<MyMessage> mq;
    //啟動線程
    std::thread t1([&]() {
        MyMessage msg;
        while (1) {
            //等待隊列的消息
            mq.wait(msg);
            printf("receive message type:%d\n", msg.type);
            if (msg.type == 1001)
                break;
        }
        printf("thread exited\n");
        });
    //發(fā)送消息給線程
    MyMessage msg;
    printf("send number message to thread.1001 exit\n");
    while (1)
    {
        scanf("%d", &msg.type);
        mq.push(msg);
        if (msg.type == 1001)
            break;
    }
    t1.join();
    return 0;
}

輪詢消息

#include<thread>
//自定義消息對象
class MyMessage {
public:
    int type;
    void* param1;
    void* param2;
};
int main(int argc, char* argv[])
{
    //初始化消息隊列
    MessageQueue<MyMessage> mq;
    //啟動線程
    std::thread t1([&]() {
        MyMessage msg;
        while (1) {
            //輪詢隊列的消息
            if (mq.poll(msg))
            {
                printf("receive message type:%d\n", msg.type);
                if (msg.type == 1001)
                    break;
            }
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
        printf("thread exited\n");
        });
    //發(fā)送消息給線程
    MyMessage msg;
    printf("send number message to thread.1001 exit\n");
    while (1)
    {
        scanf("%d", &msg.type);
        mq.push(msg);
        if (msg.type == 1001)
            break;
    }
    t1.join();
    return 0;
}

總結

以上就是今天要講的內容,實現一個簡單消息隊列還是比較容易的,尤其是c++有標準庫支持的情況下,也能滿足大部分使用場景,比如實現線程切換或者async、await底層就需要用到消息隊列。寫這篇博文的主要目的也是用于記錄,以后需要用到的時候可直接網上拷貝。

到此這篇關于C++實現一個簡單消息隊列的示例詳解的文章就介紹到這了,更多相關C++消息隊列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MFC對話框中實現走馬燈效果

    MFC對話框中實現走馬燈效果

    這篇文章主要為大家詳細介紹了MFC對話框中實現走馬燈效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言二叉樹的概念結構詳解

    C語言二叉樹的概念結構詳解

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數據結構。本文將詳細介紹一下C++中二叉樹的實現和遍歷,需要的可以參考一下
    2022-08-08
  • C語言實現的程序員老黃歷實例

    C語言實現的程序員老黃歷實例

    這篇文章主要介紹了C語言實現的程序員老黃歷,涉及日期的判定及流程控制的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C++利用inotify+epoll實現異步文件監(jiān)控的方法

    C++利用inotify+epoll實現異步文件監(jiān)控的方法

    這篇文章講給大家詳細介紹一下C++利用inotify+epoll實現異步文件監(jiān)控的方法,inotify是一種異步文件監(jiān)控機制,文章通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • 線程崩潰不會導致?JVM?崩潰的原因解析

    線程崩潰不會導致?JVM?崩潰的原因解析

    網上看到一個很有意思的據說是美團的面試題:為什么線程崩潰崩潰不會導致?JVM?崩潰,這個問題我看了不少回答,但都沒答到根本原因,所以決定答一答,相信大家看完肯定會有收獲,本文分以下幾節(jié)來探討,需要的朋友可以參考下
    2022-06-06
  • C++實現LeetCode(107.二叉樹層序遍歷之二)

    C++實現LeetCode(107.二叉樹層序遍歷之二)

    這篇文章主要介紹了C++實現LeetCode(107.二叉樹層序遍歷之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • Objective-C中使用STL標準庫Queue隊列的方法詳解

    Objective-C中使用STL標準庫Queue隊列的方法詳解

    這篇文章主要介紹了Objective-C中使用STL標準庫Queue隊列的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 淺談C++性能榨汁機之偽共享

    淺談C++性能榨汁機之偽共享

    使給定內存位置被一個線程所訪問,可能還是會有乒乓緩存的存在,是因為另一種叫做偽共享(false sharing)的效應。即使數據存儲在緩存行中,多個線程對數據中的成員進行訪問時,硬件緩存還是會產生乒乓緩存。本文將介紹C++中的偽共享
    2021-06-06
  • C++中vector的清理回收的方式

    C++中vector的清理回收的方式

    這篇文章主要介紹了C++中vector的清理回收的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++編程語言中賦值運算符重載函數(operator=)的使用

    C++編程語言中賦值運算符重載函數(operator=)的使用

    本文主要介紹了C++編程語言中賦值運算符重載函數(operator=)介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06

最新評論