我有多个进程需要彼此通信。我想通过消息队列来完成此任务。 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;
}
}
}
这似乎通常可行。我担心:
现在B已连接到由崩溃的进程创建的队列。如果B的名称相同,B是否仍然在每个角落都连接到B中新创建的队列? 我通常将如何实施?如果我在每次发送/接收调用之前简单地在堆栈上打开一个对象,那么我可能会比较安全。