用协同程序隐藏阻止操作

时间:2019-04-24 07:49:01

标签: c++ boost zeromq coroutine

我有一个通过UDP接收数据的服务,我想添加一些zmq订户。我也想使用zmq套接字而不阻塞。而且我不想为此创建单独的线程。

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

我认为我缺少了一些东西,只是使用了不正确的工具。 那么问题是隐藏阻止接收的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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

使用documentation可以定义超时并仍然进行阻塞读取。

// 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
}

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