我正在尝试将ZMQ通信集成到测试用例中,但是即使我为操作设置了500ms的超时时间,zmq::socket_t::recv
还是存在无限期阻塞的问题。表现出行为的最小测试用例看起来像这样
#include <gtest/gtest.h>
#include <zmq.hpp>
TEST(timeout, not_working_in_recv)
{
zmq::context_t zmq_context;
zmq::socket_t sub(zmq_context, ZMQ_SUB);
sub.setsockopt(ZMQ_SUBSCRIBE, "");
int const timeout_ms = 500;
sub.setsockopt(ZMQ_RCVTIMEO, &timeout_ms);
sub.connect("inproc://pubsub_test");
zmq::message_t msg;
sub.recv(&msg);
}
[还有许多更复杂的设置,其中我设置了一个创建相应发布者的线程,但结果始终是阻止接收。该块不是很不确定,最终它确实会返回。
这是使用MSVC 2017和ZMQ 4.2.2在Windows 10,x32下编译和执行的。
有人知道为什么接收呼叫被阻塞以及如何解决?
sub.setsockopt(ZMQ_RCVTIMEO, &timeout_ms); // set timeout to address of timeout_ms variable
应该是
sub.setsockopt(ZMQ_RCVTIMEO, timeout_ms); // set timeout to value of timeout_ms