2

是否可以通过 POSIX 消息队列正确安全地传递类对象指针?

例如,

Object *obj = new Object();

mq_send(mqdes, static_cast<char*>&obj, sizeof(obj), 1);

并在接收方,执行reinterpret_cast回我的Object

由于消息队列在 Linux 上使用文件描述符,我很好奇它是如何工作的。我尝试过没有成功,但我认为我可能做错了什么。

4

1 回答 1

3

不是真的...仅当对象仅包含基本类型字段和具有基本类型字段的其他结构时。如果您发送一个指针,如果它驻留在另一个进程或另一个系统中,则不能从另一端重用它。

同样使用具有继承和虚拟方法的类,可能会一团糟!

从我的角度来看,最好添加一种 Serialize 方法。

同样传递以这种方式序列化的 struct 二进制文件根本不可移植,如果您想在其他系统中使用相同的机制,或者如果您更改结构或对象打包之类的东西,可能会给您带来几个问题。

自定义序列化\反序列化将是首选且更便携,但选择当然是您的。

就像是 ...

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*)... 您只需要发送指针,而不是对象本身。

于 2011-10-21T21:32:51.157 回答