c++ - 在使用 boost::asio 和 boost::iostreams(或其他东西?)进行异步非阻塞文件加载方面需要帮助

标签 c++ file-io asynchronous boost-asio boost-iostreams

我正在使用 C++ 进行编码,并且正在尝试异步加载图像文件。经过一些研究,我发现了一些关于使用 boost::asio 和 boost::iostreams 来完成它的提及。但是,boost::asio 的文档和示例主要与套接字相关,因此对我帮助不大。

这是我需要的:

  • 异步加载文件并在加载完成后执行回调函数。(在我的例子中,回调函数使用 v8 javascript 引擎执行 javascript 函数对象)
  • 回调函数必须与主函数在同一个线程中执行。 (因为 v8 不是线程安全的。)
  • 需要在 Linux 和 Windows 上工作。 (单独的实现是可以的)

所以,像这样的东西会非常好:

async_read("test.jpg", &the_callback_function);

该函数不应阻塞,并且在文件加载完成后,它应该运行“the_callback_function”。

编辑:正如 joshperry 指出的那样,boost::asio 可能无法分派(dispatch)回主线程。所以,我想我不必仅限于 boost::asio 和 boost:iostreams。任何可以帮助满足此要求的 c/c++ 库都应该没问题。谢谢!

最佳答案

您可以通过更多的脚手架来做您想做的事,但是为了在您的主线程上执行回调,主线程必须等待一些信号,表明回调已准备就绪。这是一种方法。我假设您的主线程已经有某种形式的执行循环。

  • 添加一个线程安全的通知队列,后台线程可以使用它来通知主线程要执行的回调。
  • 修改您的主执行循环以等待该队列以及它所等待的任何其他事件源(显然,我假设您的主线程中有一个事件驱动循环,如果您没有,请根据自己的喜好进行调整: ).
  • 继续使用带回调的asio async_read,只是回调不会直接执行完成函数,而是会排队到主线程执行。

使用 STL 和同步对象(例如由 Boost.Thread 提供的对象)可移植地构建这样的队列并不难。构建它以在没有争用的情况下扩展到高吞吐量是另一回事,但听起来您并不需要那种扩展。即使其他库会为您做所有这些,您自己构建这样的东西对于任何进行多线程编程的人来说都是一项很好的练习,尤其是当所涉及的一个或多个组件不可重入时。

关于c++ - 在使用 boost::asio 和 boost::iostreams(或其他东西?)进行异步非阻塞文件加载方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1985705/

相关文章:

c++ - 在不存在的对象上调用静态成员函数

c++ - C++ 中的列表列表

c++ - 在 C++ 中重载不同类型的比较运算符

c++ - G++ - 未定义对已定义成员函数的引用

c++ - 将大文件从 RAM 写入磁盘

c - 如何从文本文件中的制表符分隔字段中正确获取数据

vb.net - 如何写入/读取 "settings"文本文件

ios - 如何正确使用完成处理器

c# - 在 "long"间隔后完成可观察序列

javascript - 将异步函数与同步函数混合?