我有一个std::iostream
对象(例如fstream
),我想用它来进行异步操作boost::asio
。那可能吗?我知道 asio 不支持文件操作,但有时异步处理文件 IO 很有用。我可以使用特定于平台的本机文件描述符,然后将它们与 asio 一起使用,但我认为使用标准 C++ 流在 C++ 中会更优雅,而且更便携。
问问题
779 次
1 回答
2
虽然 Boost.Asio 不支持文件操作,但它确实为应用程序提供了以异步方式执行文件操作的工具集。实现此目的的常用方法是使用 Boost.Asio 创建线程池。应用程序会将文件操作发布到线程池中,并立即返回。然后线程池将同步执行操作,并在完成时调用或发布完成处理程序。
有几点需要考虑:
- 允许应用程序提示线程池的并发级别。这将允许线程池分配足够的线程来满足应用程序的预期需求。
- 将在其中调用完成处理程序的线程。例如,它可以在执行同步操作的同一线程中执行,或者发布到在
io_service
发布文件操作时提供给池的不同线程中。 - 完成处理程序的同步或异步行为。例如,如果完成处理程序是strand::wrap的结果,那么它将被异步调用到工作线程。因此,完成处理程序的参数必须保持有效,直到处理程序被调用。这通常可以通过允许按值传递或移动参数来解决。
最后,libuv是一个提供同步和异步文件操作的 C 库。它可能能够作为有价值的底层实现或参考材料。
于 2012-11-09T17:32:35.347 回答