1

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

4

1 回答 1

2

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

有几点需要考虑:

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

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

于 2012-11-09T17:32:35.347 回答