zmq::message_t 发送后可以重复使用吗?



我正在使用ZeroMQ来实现玩具通信协议;这是我第一次使用这个框架/库。

现在,在我的协议中,某个方发送了多个连续的消息,所有这些消息都具有相同的大小。所以 - 我想,我会避免重新分配它们,而只是尝试用不同的内容重新填充消息数据缓冲区,例如:

zmq::message_t msg { fixed_common_size };
while (some_condition()) {
    my_filling_routine(msg.data(), fixed_common_size);
    the_socket.send(msg);
}

但是在这个循环的第二次迭代中,我得到了一个分段错误; 不过msg.data()并不nullptr。我突然想到,也许 ZeroMQ 以某种方式蚕食了内存,因此我需要写这样的东西:

zmq::message_t msg { fixed_common_size };
char buffer[fixed_common_size];
while (some_condition()) {
    my_filling_routine(buffer, fixed_common_size);
    msg.rebuild(buffer, fixed_common_size);
    the_socket.send(msg);
}

但我确信这会导致去分配和重新分配。

那么,真的需要rebuild(),还是只是我的代码中的一些错误?

注意:我使用的是Unix套接字,以防答案以某种方式取决于此。

不,您不能在发送zmq::message_t后重复使用它。

首先,欢迎来到ZeroMQ,对于分布式系统从业者来说,这是一个很酷的地方。

ZeroMQ API 非常明确地警告了这些问题。对zmq_msg_send()的成功调用,引用消息有效负载,并不意味着消息本身已经实际发送。

最好试着想象调用只是将责任从应用程序代码"移动">到 ZeroMQ 引擎(在工厂内部,在 Context() 实例中实例化了 IO线程池... (。

传递给zmq_msg_send()zmq_msg_t结构在调用期间无效

接下来最好不要再碰它,如上所述:o(

分配器的最大"生态"绕过是重用整个消息,如:

如果要将相同的消息发送到多个套接字,则必须使用(例如使用zmq_msg_copy() (复制它。


关于复制的额外警告...

再加上一个提出的观点:可能会复制,但在此之后敢于尝试修改它......

避免在使用zmq_msg_copy()复制消息后修改消息内容,这样做可能会导致未定义的行为。如果您需要的是实际的硬拷贝,请使用 zmq_msg_init_size() 分配新邮件,并使用 memcpy() 复制邮件内容。

切勿直接访问zmq_msg_t成员,而应始终使用 zmq_msg 函数系列。

相关内容

  • 没有找到相关文章

最新更新