提升:单线程IO服务

时间:2014-09-18 01:42:19

标签: c++ boost boost-asio boost-context

在我的应用程序中,我将收到各种我希望按优先顺序异步处理的事件。

我可以使用boost::asio::io_service执行此操作,但我的应用程序是单线程的。我不想为多线程程序支付锁和mallocs的费用(性能成本对我来说非常重要)。我基本上在寻找为单线程执行而编写的boost::asio::io_service

我很确定我可以使用boost::coroutine自己实现这一点,但在此之前,是否存在为单线程执行而编写的boost::asio::io_service之类的东西?我已经扫描了增强型库的列表,没有什么特别突出我

2 个答案:

答案 0 :(得分:2)

当您使用Asio的任何非阻止调用时,请注意 支付同步费用。

即使您可能使用单个线程来调度工作并处理生成的回调,但Asio可能仍需要在内部生成其他线程以执行异步调用。这些将同时访问io_service

考虑套接字上的async_read:一旦接收到的数据可用,套接字就必须通知io_service。这与您的主线程同时发生,因此需要额外的同步。

对于阻塞I / O这个问题在理论上消失了,但由于异步I / O是库的整个点,我不希望在实现中找到太多针对这种情况的优化。

pointed out in the comments一样,只有一个主线程,io_service上的争用率非常低,所以除非分析表明存在明显的性能瓶颈,否则你不应该担心它太多。

答案 1 :(得分:1)

我建议将boost :: asio与boost :: coroutine一起使用 - > boost :: asio :: yield_context(已经是coroutine + io_service之间的耦合)。如果检测到具有更高优先级的任务,则可以暂停当前任务并开始以更高优先级处理任务。 问题是你必须在任务代码中定义/调用某些检查点,以便在给出条件(更高的prio任务入队)时暂停任务。