1

我正在用 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 可能无法调度回主线程。所以,我想我不必仅限于 boost::asio 和 boost:iostreams。任何可以帮助满足此要求的 c/c++ 库都应该没问题。谢谢!

4

1 回答 1

1

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

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

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

于 2009-12-31T15:56:23.497 回答