是否可以通过POSIX消息队列正确安全地传递类对象指针?
例如,
Object *obj = new Object();
mq_send(mqdes, static_cast<char*>&obj, sizeof(obj), 1);
在接收方,执行reinterpret_cast
回Object
?
由于消息队列在Linux上使用文件描述符,我很好奇这是如何工作的。我尝试过但没有成功,但我认为我可能做错了。
答案 0 :(得分:3)
不是......仅当对象仅包含基本类型字段和其他具有基本类型字段的结构时。如果您发送指针,如果它位于另一个进程或另一个系统中,则无法从另一方重用它。
同样使用具有继承和虚方法的类,它可能是一团糟!
从我的角度来看,最好添加一种Serialize方法。
同样传递以这种方式序列化的结构二进制文件根本不可移植,如果您想要与其他系统使用相同的机制,或者如果您更改结构或类似对象的包装,则可能会带来几个问题。
自定义序列化\反序列化将是首选且更具可移植性,但选择当然是您的。
像...一样的东西。
template<typename T>
int SerializeAndSendObject(mqd_t mqdes, const T* instance)
{
MySerializationStream stream;
instance->SerializeTo(stream);
mq_send(stream.toBuffer(), stream.size());
}
如果你只是在两个线程之间发送而不是发送对象的内容,我只会发送指向一个用new分配的对象的指针,我将从另一侧解除分配。 在处理队列时要小心,你必须首先销毁所有挂起的对象!
Object* pointer = &obj;
mq_send(mqdes, static_cast<char*>(pointer), sizeof(Object*), 1);
注意sizeof(Object *)...你只需要发送指针,而不是对象本身。