有没有办法使用boost :: asio的std :: iostream对象?

时间:2012-11-09 11:55:06

标签: c++ boost boost-asio

我有一个std::iostream对象(例如fstream),我希望将它用于boost::asio的异步操作。那可能吗?我知道asio不支持文件操作,但有时异步处理文件IO很有用。我可以使用特定于平台的本机文件描述符,然后将它们与asio一起使用,但我认为使用标准C ++流在C ++中会更优雅,也更便于使用。

1 个答案:

答案 0 :(得分:2)

虽然Boost.Asio不支持文件操作,但它确实为应用程序提供了以异步方式执行文件操作的工具集。实现此目的的常用方法是使用Boost.Asio创建线程池。应用程序会将文件操作发布到线程池中,立即返回。然后,线程池将同步执行操作,并在完成时调用或发布完成处理程序。

有几点需要考虑:

  • 允许应用程序提示线程池的并发级别。这将允许线程池分配足够的线程以满足应用程序的预期需求。
  • 将调用完成处理程序的线程。例如,它可以在执行同步操作的同一线程中执行,也可以发布到发布文件操作时提供给池的不同io_service
  • 完成处理程序的同步或异步行为。例如,如果完成处理程序是strand::wrap的结果,那么它将被异步调用到工作线程。因此,在调用处理程序之前,完成处理程序的参数必须保持有效。这通常可以通过允许参数传递或移动来解决。

最后,libuv是一个提供同步和异步文件操作的C库。它可以作为有价值的底层实现或参考材料。