代码之家  ›  专栏  ›  技术社区  ›  Aaron Qian

需要有关使用boost::asio和boost::iostreams(或其他方法)异步非阻塞文件加载的帮助。

  •  1
  • Aaron Qian  · 技术社区  · 15 年前

    我在C++中编码,我正在尝试异步加载一个图像文件。经过一些研究,我发现有一些关于使用boost::asio和boost::iostreams来完成这项工作的提到。但是,boost::asio的文档和示例大多与套接字相关,因此对我没有太大帮助。

    我需要的是:

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

    所以,像这样的事情会非常好:

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

    函数不应阻塞,文件加载完成后,它应运行“回调函数”。

    编辑:正如JoshPerry所指出的,Boost::Asio可能无法调回主线程。所以,我想我不必仅限于boost::asio和boost:iostreams。任何有助于这个要求的C/C++库都应该是好的。谢谢!

    1 回复  |  直到 15 年前
        1
  •  1
  •   aalpern    15 年前

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

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

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