在我的应用程序中,我将收到各种我希望按优先顺序异步处理的事件。
我可以使用boost::asio::io_service
执行此操作,但我的应用程序是单线程的。我不想为多线程程序支付锁和mallocs
的费用(性能成本对我来说非常重要)。我基本上在寻找为单线程执行而编写的boost::asio::io_service
。
我很确定我可以使用boost::coroutine
自己实现这一点,但在此之前,是否存在为单线程执行而编写的boost::asio::io_service
之类的东西?我已经扫描了增强型库的列表,没有什么特别突出我
答案 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任务入队)时暂停任务。