我試圖通過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(intflags_, zmq_msg_t * msg_, zmq::socket_base_t * s_)
libzmq.so.5! zmq_send(void * s_, const void * buf_, size_t len_, intflags_)
為什么會發生這種情況?ZMQ試圖處理什么命令?為什么它會呼叫recv()?是因為高水位嗎?我想這是另一回事,因為我發送的資料量很小,而且水位線應該還沒有達到。如果水位線是唯一的解釋,那么我怎樣才能測量它?
。uj5u.com熱心網友回復:
一般來說,當套接字達到某種未發送資料的限制時,這種情況就會發生;然后它將阻塞,等待允許它繼續的確認訊息。
精確的行為取決于 zmq_socket 型別以及你對它所做的任何其他配置(例如,設定高水位)。
uj5u.com熱心網友回復:
事實證明,這是我的代碼邏輯中的錯誤。在發送了一些資訊之后,下一個資訊是由不同的執行緒使用不同的套接字發送的。那個套接字沒有連接,所以zmq_send()在等待連接的建立。這就是為什么它的管道是空的。謝謝大家的幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334265.html
標籤:
