Gute Tag Leute,64bit und 32bit Prozess Sprech boost :: message_queue
Ich bin derzeit versucht, einen Weg finden, um Daten zwischen einem 64-Bit-Prozess und einem 32-Bit-Prozess zu übergeben. Da es sich um eine Echtzeitanwendung handelt und beide auf demselben Computer ausgeführt werden, verwende ich Shared Memory (shm).
Während ich nach einem Synchronisationsmechanismus mit shm suchte, fühlte ich mich auf boost :: message_queue. Aber es funktioniert nicht.
Mein Code ist im Grunde die folgenden:
Sender Teil
message_queue::remove("message_queue");
message_queue mq(create_only, "message_queue", 100, sizeof(uint8_t));
for (uint8_t i = 0; i < 100; ++i)
{
mq.send(&i, sizeof(uint8_t), 0);
}
Empfängerteil
message_queue mq(open_only, "message_queue");
for (uint8_t i = 0; i < 100; ++i)
{
uint8_t v;
size_t rsize;
unsigned int rpriority;
mq.receive(&v, sizeof(v), rsize, rpriority);
std::cout << "v=" << (int) v << ", esize=" << sizeof(uint8_t) << ", rsize=" << rsize << ", rpriority=" << rpriority << std::endl;
}
Dieser Code funktioniert perfekt, wenn die beiden Verfahren 64bit oder 32bit sind. Aber funktioniert nicht, wenn die beiden Prozesse nicht identisch sind.
Blick tiefer in Boost (1.50.0) Code, den Sie die folgende Zeile in message_queue_t sehen werden :: do_receive (Boost/Inter/IPC/message_queue.hpp):
scoped_lock lock(p_hdr->m_mutex);
Aus irgendeinem Grund, in der Mutex scheint bei heterogenen Prozessen gesperrt zu sein. Meine wilde Vermutung wäre, dass der Mutex versetzt ist und daher sein Wert ist beschädigt, aber ich bin mir nicht ganz sicher.
Versuche ich etwas zu erreichen, das einfach nicht unterstützt wird?
Jede Hilfe oder Beratung wird geschätzt.
Das war keine wilde Vermutung, das ist richtig. Sie setzen den Mutex in den gemeinsamen Speicher und ihm gehen Elemente voraus, deren Größe von der Bissigkeit abhängt. Das kann nicht funktionieren. –