C++ std::future

2024 年 8 月 29 日 | 4 分钟阅读

C++ 标准库中用于多线程异步编程的最有用工具之一是 std::future。这部分对于处理异步操作和从并发运行的作业中获取输出至关重要。它包含在 C++11 并发实用程序中,提供了一种处理异步计算的标准方法,允许程序员创建响应迅速且高效的程序。

什么是 std::future?

std::future 是一种从并发操作中获取值的方法,并发操作可以在不同的线程或任务中异步运行。它包含一个可能目前无法访问的值,并提供一种在相关任务完成后检索结果的方法。此功能是 C++ 较大并发架构的一部分,它促进了异步任务之间的有效通信。

基本用法

为了使用 std::future,需要在代码中包含 <future> 头文件。基本工作流程是创建一个与特定异步作业链接的 std::future 对象,然后在结果可用时检索结果。

示例

让我们看一个简单的例子,其中函数 performTask() 产生一个异步结果

输出

Result: 42

说明

performTask() 函数:-

  • performTask() 是一个使用 std::this_thread::sleep_for(std::chrono::seconds(3)) 模拟繁重操作的函数。
  • 它在等待三秒后返回整数 42。

main() 函数

  • main() 中创建一个名为 result 的 std::future
  • 通过在另一个线程中使用 std::launch::async 标识的 performTask(),使用 std::async() 启动一个异步作业。
  • 异步任务的结果链接到 std::future 对象 result。

获取结果

  • 程序在启动异步作业后继续执行(“在 performTask 异步运行时执行其他工作”)。
  • 当需要异步操作的结果时,使用 result 函数。
  • std::future get() 方法会冻结执行,直到结果准备就绪。
  • 获取的结果保存在 int 变量 finalResult 中。
  • 最后,程序使用 std::cout 打印收到的结果。

C++ std::future

  • std::future: 它是可能尚未可用的值的占位符。它用于获取异步操作的结果。
  • std::async(): 它是一个启动异步任务并返回带有任务结果的 std::future 的函数。
  • std::launch::async 关键字指定作业应在不同的线程中异步运行。
  • std::future::get(): 此函数用于检索异步操作的结果。如果结果尚未准备就绪,get() 方法将阻塞当前线程,直到结果准备就绪。
  • 异步操作:代码使用 std::async 在单独的线程中启动一个耗时操作 (performTask()),允许主线程在操作异步运行时继续处理。
  • 同步:程序使用 get() 方法与异步进程同步,并在结果可用时接收最终结果,确保程序仅在检索结果后才继续。

总的来说,这段代码展示了如何在 C++ 中使用 std::future 执行异步作业 (performTask()) 并高效地检索其结果,同时允许主线程继续执行。

异常管理:-

此外,std::future 提供了一种机制来处理在异步任务执行期间可能出现的异常。异常通过使用 std::future::wait()std::future::wait_for() 捕获,并通过利用 std::future::get() 方法传播。

超时和等待函数:-

有多种方法可以等待结果可用或使用 std::future 指定等待超时时间。

其中包括 wait()、wait_for()wait_until() 函数。

wait(): 在阻塞当前线程之前等待结果可用。

wait_for(): 此方法用于在预定时间内延迟释放结果。

wait_until(): 此方法用于在指定时间之前延迟释放结果。

  • 这些技术提供了处理不希望无限期等待的情况以及管理异步进程的灵活性。

共享 Future 和 Promise:-

  • 除了 std::future 之外,C++ 还提供了 std::promise 和 std::shared_future 来帮助线程间通信。
  • 当设置可以通过 std::future 异步检索的值或异常时,请使用 std::promise
  • 许多 std::future 实例的异步结果可以通过 std::shared_future 共享。

最佳实践和注意事项

  • 避免不必要的阻塞:在多线程设置中,过度阻塞未来可能会导致性能问题。在实际可行的情况下,采用非阻塞方法。
  • 异常处理:使用 std::future 时,务必仔细处理异常,以避免程序意外终止。
  • 资源管理:在确定资源的拥有权和生命周期时要谨慎,尤其是在使用共享 future 和多个线程时。
  • 明智地使用 std::async:虽然 std::async 是一种启动异步操作的便捷技术,但不同的实现可能表现不同。在广泛采用之前,请了解其细微差别。

结论

总之,C++ 的 std::future 模块是组织异步任务和生成并发进程输出的有效工具。由于其功能,开发人员可以以标准方式创建异步计算,并创建响应迅速且高效的应用程序。程序员可以通过学习如何使用它、处理错误、使用等待函数和应用最佳实践来利用 std::future 的功能来创建可伸缩和可靠的并发编程应用程序。