我正在使用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
函数系列。