c++ - 将类对象指针打包成 char * 用于消息队列

标签 c++ linux message-queue reinterpret-cast static-cast

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

例如,

Object *obj = new Object();

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

并在接收端,执行reinterpret_cast回到我的对象

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

最佳答案

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

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

从我的角度来看,最好添加一种 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*)...您只需发送指针,而不是对象本身。

关于c++ - 将类对象指针打包成 char * 用于消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855480/

相关文章:

c++ - 样式的 Windows 应用程序 xaml 数据绑定(bind)

c++ - __cplusplus < 201402L 在 gcc 中返回真,即使我指定了 -std=c++14

linux - linux "clock()"函数是否计入进程的 "sleep"时间?

c++ - C++ 的数据库访问库

rabbitmq - 如果rabbitmq不能用作锁定服务,那么什么可以?

c++ - 与 Mac OS X 上的间接依赖关系的链接问题

c++ - 获得两个无符号整数乘积的高 32 位的有效方法 C++

linux - opensips 在 Ubuntu 上为音频视频通话打开 ims 和星号配置?

java - Kafka : Single consumer group, 无分区和多个主题

windows - Azure:如何将消息从有害队列移回主队列?