2012-11-09 49 views
1

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

+0

由于快速异步IO机制往往是相当低层次的平台特定,我认为标准库流太抽象,不适合您的需求。我相当肯定你在这个特定的例子中运气不好。如果boost没有提供某种异步流,那么您必须为此寻找另一个第三方库。 – Rook

+0

哪个平台? –

+2

'boost :: asio'不是一个通用的异步I/O库,它直接针对的是非平凡的支持select或类似系统调用的长延迟流。对于具有磁盘文件的异步I/O,需要完全不同的API。 –

回答

1

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

有几点考虑:

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

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

相关问题