如何正确使用增强队列?

时间:2018-10-15 21:30:51

标签: c++ boost message-queue boost-interprocess

我有多个进程需要彼此通信。我想通过消息队列来完成此任务。 Boost消息队列似乎是为此目的而建立的。提升队列似乎是在主从体系结构之后创建的(需要在任何进程可以向该队列发送消息之前创建该队列)。 现在,如果任何单个进程崩溃,整个系统应该能够恢复。

这是我到目前为止所拥有的:

常用:

#include <iostream>
#include <cstring>
#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <fstream>

using namespace boost::interprocess;

message_queue *queue = nullptr;

bool getData(uint8_t &data) {
    if (queue == nullptr)
        return false;

    unsigned int priority;
    message_queue::size_type recvd_size;
    queue->try_receive(&data, sizeof(uint8_t), recvd_size, priority);

    return recvd_size > 0;
}

void sendData(uint8_t data) {
    if (queue == nullptr)
        return;

    queue->try_send(&data, sizeof(uint8_t), 0);
}

A(发送器):

int main()
{
    reconnect:
    try {
        //Open a message queue.
        queue = new message_queue(
                open_only,
                "message_queue"
        );
    } catch (interprocess_exception &ex) {
        std::cout << "Error creating queue" << ex.get_error_code() << ex.what() << std::endl;
        goto reconnect;
    }

    std::cout << "Transmitter connected!" << std::endl;

    sendData(1);

    return 0;
}

B(接收方):

int main()
{
    message_queue::remove("message_queue");
    reconnect:
    try {
        //Open a message queue.
        queue = new message_queue(
                open_or_create,
                "message_queue",
                10,
                sizeof(uint8_t)
        );
    } catch (interprocess_exception &ex) {
        std::cout << "Error creating queue" << ex.get_error_code() << ex.what() << std::endl;
        goto reconnect;
    }

    std::cout << "Receiver connected! Receiving..." << std::endl;

    uint8_t data;
    while(true) {
        if (getData(data)) {
            std::cout << "RX data " << data << std::endl;
        }
    }
}

这似乎通常可行。我担心:

  • A:创建队列
  • B:连接到队列
  • A:终止/崩溃并重新启动

现在B已连接到由崩溃的进程创建的队列。如果B的名称相同,B是否仍然在每个角落都连接到B中新创建的队列? 我通常将如何实施?如果我在每次发送/接收调用之前简单地在堆栈上打开一个对象,那么我可能会比较安全。

0 个答案:

没有答案