C语言 zmq_send() blocks on recv()/poll()



我尝试通过inproc pair socket发送一些小的(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的原因。谢谢大家的帮助。

最新更新