gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:28 25 4
gpt4 key购买 nike

我有一个通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com