Pages - Menu

標籤

AWS (1) bash (1) Boost (2) C (2) CMake (2) Concurrency_Programming (3) CPP (37) Database (2) DNS (1) Docker (4) Docker-Compose (1) ELK (1) emacs (4) gcp (1) gdrive (1) git (1) gitbash (2) gitlab (1) kvm (4) Linux (5) MT4 (4) MT5 (4) Multicast (2) MySQL (2) Nijatrader8 (1) OpenCV (1) Python (4) QT5 (1) R (1) rdp (3) screenshot (1) ssh (3) Tabnine (1) TCP (1) TensorFlow (1) Tools (12) Ubuntu_1904 (11) Ubuntu_20_04 (5) UDP (1) VS2010 (1) VS2015 (1) VS2019 (1) WebServer (1) Win10 (1) winmerge (1) WSL (1) xrdp (1)

搜尋此網誌

2020年5月1日星期五

Simple One mutex Message queue for Linux

Aim

This is an example to show 2 kind of message queue. The first one is using std library shared_ptr. The second one is using custom SmartPointer which is Linux dependence.

Source

github


#include <iostream>
#include <thread>
#include <chrono>

#include "MsgQ.h"
#include "DefaultMsgQ.h"

class BaseMsg
{
public:
    BaseMsg() {}
    virtual ~BaseMsg() {}

    void SetCount(int count) { m_count = count; }
    int GetCount() { return m_count; }
protected:
    int m_count;
};
class ChildMsg : public BaseMsg
{
public:
    ChildMsg() {}
    ~ChildMsg() {}
};

MsgQ<BaseMsg> m_msgQ;
void PushWorker()
{
    for (int i = 0; i < 3; i++)
    {
        std::shared_ptr<BaseMsg> msg = std::make_shared<ChildMsg>();
        msg->SetCount(i);
        m_msgQ.AddMsg(msg);
        std::cout << "Add Msg: " << i << std::endl;
    }
}
void PullWorker()
{
    int count = 0;
    while (count < 2)
    {
        std::shared_ptr<BaseMsg> msg;
        m_msgQ.GetMsg(msg);
        count = msg->GetCount();
        std::cout << "Get Msg: " << count << std::endl;
    }
}

DefaultMsgQ<BaseMsg> m_defaultMsgQ;
void PushWorker_Default()
{
    for (int i = 0; i < 3; i++)
    {
        SmartPointer<BaseMsg> msg = StaticCast<BaseMsg>(MakeSmartPointer<ChildMsg>());
        msg->SetCount(i);
        m_defaultMsgQ.AddMsg(msg);
        std::cout << "Add Msg: " << i << std::endl;
    }
}
void PullWorker_Default()
{
    int count = 0;
    while (count < 2)
    {
        SmartPointer<BaseMsg> msg;
        m_defaultMsgQ.GetMsg(msg);
        count = msg->GetCount();
        std::cout << "Get Msg: " << count << std::endl;
    }
}
int main(int argc, char *argv[])
{
    std::cout << "Msg Q example." << std::endl;
    std::thread pushTH(PushWorker);
    pushTH.detach();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::thread pullTH(PullWorker);
    pullTH.detach();
    std::this_thread::sleep_for(std::chrono::seconds(1));

    std::cout << std::endl;
    std::cout << "Default Msg Q example." << std::endl;
    std::thread pushTH_Default(PushWorker_Default);
    pushTH_Default.detach();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::thread pullTH_Default(PullWorker_Default);
    pullTH_Default.detach();
    std::this_thread::sleep_for(std::chrono::seconds(1));

    return 0;
}

Output

$ ./src/MsgQ 
Msg Q example.
Add Msg: 0
Add Msg: 1
Add Msg: 2
Get Msg: 0
Get Msg: 1
Get Msg: 2

Default Msg Q example.
Add Msg: 0
Add Msg: 1
Add Msg: 2
Get Msg: 0
Get Msg: 1
Get Msg: 2

沒有留言:

發佈留言