c++ - recv 阻塞时如何正确清理?

标签 c++ zeromq

考虑下面的示例代码(我快速输入它作为示例,如果有错误也没关系 - 我对理论很感兴趣)。

bool shutDown = false; //global

int main()
{
  CreateThread(NULL, 0, &MessengerLoop, NULL, 0, NULL);
  //do other programmy stuff...
}


DWORD WINAPI MessengerLoop( LPVOID lpParam )
{
  zmq::context_t context(1);
  zmq::socket_t socket (context, ZMQ_SUB);
  socket.connect("tcp://localhost:5556");
  socket.setsockopt(ZMQ_SUBSCRIBE, "10001 ", 6);

  while(!shutDown)
  {
    zmq_msg_t getMessage;
    zmq_msg_init(&getMessage);
    zmq_msg_recv (&getMessage, socket, 0); //This line will wait forever for a message
    processMessage(getMessage); 
  }
}

创建一个线程来等待传入的消息并适本地处理它们。线程一直循环,直到 shutDown 设置为 true。

在 ZeroMQ 中 Guide具体说明必须清理的内容,即消息、套接字和上下文。

我的问题是:由于 recv 将永远等待消息,阻塞线程,如果从未收到消息,我如何才能安全地关闭该线程?

最佳答案

阻塞调用将以几种方式退出。首先,这取决于您的语言和绑定(bind),中断(Ctrl-C、SIGINT、SIGTERM)将退出调用。您将返回(同样,取决于您的绑定(bind))错误或空消息(libzmq 返回 EINTR 错误)。

其次,如果您在另一个线程中终止上下文,阻塞调用也将退出(libzmq 返回 ETERM 错误)。

第三,您可以在套接字上设置超时,因此如果没有数据,它会在超时后返回。我们不经常这样做,但在某些情况下它会很有用。

最后,我们在实践中所做的永远不会阻塞接收,而是使用 zmq_poll 找出套接字何时有消息等待,然后从这些套接字接收。这就是横向扩展以处理更多套接字的方式。

关于c++ - recv 阻塞时如何正确清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16212526/

相关文章:

c++ - 在 iOS 上使用 C++ 访问 SQLite 数据库?

c++ - 双端队列指针内存泄漏

c++ - 计算矩阵的行列式时内存泄漏

python - 如何正确打开和关闭mysql连接

javascript - 在zeromq javascript中接收超时

C++系列求和代码在大输入上给出不同的答案

c++ - 为什么 C++ 中的可变大小数组 (VLA) 需要具有自动 (auto) 存储类?

c# - 序列化 Protobuf 对象并使用 ØMQ/ZMQ 发送

node.js - nodejs zmq - 收到的缓冲区数据比实际消息

java - zeromq广播到全网