zmq_send() 在 recv()/poll() 上阻塞

zmq_send() blocks on recv()/poll()

我尝试通过 inproc 对套接字发送一些小的(8 字节)消息。然而,经过几次尝试 zmq_send() 块。当我停止调试器时,我看到以下堆栈跟踪:

libc.so.6!__GI___poll(struct pollfd * fds, nfds_t nfds, int timeout) 
libzmq.so.5!poll(int __timeout, nfds_t __nfds, pollfd * __fds) 
libzmq.so.5!zmq::signaler_t::wait(zmq::signaler_t * const this, int timeout_) 
libzmq.so.5!zmq::mailbox_t::recv(zmq::mailbox_t * const this, zmq::command_t * cmd_, int timeout_) 
libzmq.so.5!zmq::socket_base_t::process_commands(zmq::socket_base_t * const this, int timeout_, bool throttle_) 
libzmq.so.5!zmq::socket_base_t::send(zmq::socket_base_t * const this, zmq::msg_t * msg_, int flags_) 
libzmq.so.5!s_sendmsg(int flags_, zmq_msg_t * msg_, zmq::socket_base_t * s_) 
libzmq.so.5!zmq_send(void * s_, const void * buf_, size_t len_, int flags_)

为什么会这样? ZMQ 尝试处理哪些命令?为什么它会调用 recv()?是因为高水位线吗?我想这是不一样的,因为我发送了少量数据并且还没有达到水位线。如果水印是唯一的解释,那我该如何测量呢?

通常,当套接字达到某种未完成发送数据的限制时,就会发生这种情况;然后它将阻止等待允许它继续的确认消息。

具体行为取决于 zmq_socket 类型以及您对其所做的任何其他配置(例如设置高水位线)。

原来这是我代码逻辑上的错误。发送一些消息后,接下来由不同的线程使用不同的套接字发送。该套接字未连接,因此 zmq_send() 正在等待建立连接。这就是它的管道为 NULL 的原因。谢谢大家的帮助。