【问题标题】:Boost: Single Threaded IO ServiceBoost:单线程 IO 服务
【发布时间】:2014-11-12 05:14:14
【问题描述】:

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

我可以用boost::asio::io_service 做到这一点,但我的应用程序是单线程的。我不想支付锁和mallocs 你可能需要多线程程序(性能成本对我来说真的很重要)。我基本上是在寻找为单线程执行而编写的boost::asio::io_service

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

【问题讨论】:

  • 你可以把 io_service::run() int main();
  • single thread 致电io_service::run()
  • @IgorR。当然在内部,服务对象仍然会锁定它的队列。但是,我闻到过早的优化。如果您确实发现“所有同步”正在扼杀您的吞吐量/发送延迟,只需使用一个允许您替换具体细节的接口来实现它。
  • 很高兴知道锁定开销只有在每秒超过几十万次操作后才能看到。这远高于 99% 的应用程序。可能最好继续添加该线程。

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


【解决方案1】:

请注意,一旦您使用 Asio 的任何非阻塞调用,您必须支付同步费用。

即使您可能使用单个线程来安排工作和处理产生的回调,Asio 仍可能需要在内部生成额外的线程来执行异步调用。这些将同时访问io_service

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

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

就像pointed out in the comments 一样,io_service 上的争用将非常低,只有一个主线程,因此除非分析表明那里存在明显的性能瓶颈,否则您不必太担心。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多