c++ - 使用协程隐藏阻塞操作

标签 c++ boost zeromq coroutine

我有一个通过 UDP 接收数据的服务,我想添加一些 zmq 订阅者。我也想在不阻塞的情况下使用 zmq 套接字。我不想为它创建一个单独的线程。

我可以使用 zmq_socket::receive(msg, ZMQ_DONTWAIT) 但这会导致繁忙的循环和 100% 的 CPU 使用率。我从 1.58 开始尝试 boost::coroutines,但没有成功 - 我无法隐藏阻塞接收(套接字 RCVTIMEO 设置为-1).

我相信我遗漏了一些东西,只是不正确地使用了这些工具。 所以问题是隐藏阻塞接收的正确方法是什么?

最佳答案

我不确定您使用的是哪个 zeromq 包装器库,所以这里是一个基于核心 libzmq 库的示例。

使用zmq_poll这样你就可以定义超时并仍然进行阻塞读取。

// define one socket (could define multiple), set event on ZMQ_POLLIN.
zmq_pollitem_t items[] = {{socket1, 0, ZMQ_POLLIN, 0}};

while(1)
{
  // here you are polling the socket(s) defined in items with a timeout of 10ms
  int rc = zmq_poll(items, 1, 10);

  // Check which item (socket) had the event
  if(items[0].revents & ZMQ_POLLIN)
  {
    // There is data available on socket1
    // So call recv here on socket1

  } 

  // do other stuff here
}

或者,如果您只想收到回调通知,您可以使用

  • zloop来自 czmq
  • azmq用于 asio 的 zeromq

关于c++ - 使用协程隐藏阻塞操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55824882/

相关文章:

c++ - 模板特化函数参数计数

C++ Virtual boost::any 继承

php - 使用 ZeroMQ 不等待服务器响应

node.js - ZeroMQ 和 Sails.js

c++ - 为什么在实现所有模板化类方法之前我们需要 'template <class T>'

c++ - 如何在 C++ 中正确使用 ostringstream?

c++ - 将指针临时绑定(bind)到引用

boost - 使用 boost::chrono 而不链接到它

git - 使用 GitHub 上的 Modular Boost

ubuntu - 在 GitHub Actions Ubuntu runners 上安装 libzmq3-dev 时遇到问题