brava gente al giorno,64bit e intercomunicazione processo a 32 bit boost :: message_queue
Attualmente sto cercando di capire un modo per passare dati tra un processo a 64 bit e di un processo a 32 bit. Poiché si tratta di un'applicazione in tempo reale ed entrambi sono in esecuzione sullo stesso computer, utilizzo la memoria condivisa (shm).
Mentre cercavo un meccanismo di sincronizzazione con shm, ho sentito su boost :: message_queue. Tuttavia non funziona.
Il mio codice è sostanzialmente il seguente:
mittente parte
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);
}
Ricevitore parte
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;
}
Questo codice funziona perfettamente se i due processi sono a 64 bit o 32 bit. Ma non funziona se i due processi non sono gli stessi.
Guardando più in profondità nella spinta (1.50.0) Codice vedrete la seguente riga nel message_queue_t :: do_receive (boost/interprocesso/IPC/message_queue.hpp):
scoped_lock lock(p_hdr->m_mutex);
Per qualche ragione, nel il mutex sembra essere bloccato quando si lavora con processi eterogenei. La mia ipotesi sarebbe che il mutex è compensato e quindi il suo valore è corrotto, ma non ne sono del tutto sicuro.
Sto cercando di realizzare qualcosa che semplicemente non è supportato?
Qualsiasi aiuto o consiglio sarà apprezzato.
Questa non era un'ipotesi selvaggia, che è accurata. Mettono il mutex nella memoria condivisa ed è preceduto da membri le cui dimensioni dipendono dal testimone. Non puoi far funzionare questo. –