Do asio io_context.run()将线程锁定为忙等待



我认为这是一个直截了当的问题,我似乎找不到任何信息。当调用asio的io_context.run()时,如果在那一刻没有任何东西可以异步读/写,asio是否会忙于等待该线程,或者它是否会做一些更聪明的事情,让线程可以被释放并在应用程序或操作系统的其他部分使用?

我查看了代码,但我不太清楚答案是什么。我确实在某些地方看到了条件变量的使用,所以我只能假设运行调用没有忙着等待,如果它不必。

我问,因为在我们的情况下,我们想最大化线程效率,所以建议在递归异步读处理程序中放置一个线程睡眠,以防asio正忙着等待。对于一个线程,我们没有得到那么多的网络活动来最大限度地使用。

这不是在忙着等待。在这里记录:Proactor设计模式:没有线程的并发性

它突出显示了哪些底层API是根据平台而首选的:

在许多平台上,Asio通过反应器实现了actor设计模式,例如select、epoll或kqueue。

在Windows NT, 2000和XP中,Boost。Asio利用重叠I/O提供了一个高效的protor设计模式实现。


Q。建议在递归异步读处理程序中放置一个线程睡眠,以防asio忙于等待

不要那样做。保持简短的处理程序将允许您在单个服务上复用所有IO。如果你做阻塞工作,考虑把它放到一个单独的线程(池)。

最新更新