21xrx.com
2024-12-22 20:34:22 Sunday
登录
文章检索 我的文章 写文章
C++ Future的使用方法
2023-07-08 03:05:43 深夜i     --     --
C++ Future Usage of C++ Future C++ Future's implementation C++ Future's benefits C++ Future's limita

C++ Future是一种非常常用的并发编程工具,用于处理多线程中的任务分配和执行。本文将介绍Future的使用方法,包括创建、传递参数、获取结果、异常处理等。

1.创建Future对象

使用Future需要包含头文件 ,定义Future对象的语法为:


std::future<int> ft = std::async([]() return 42; );

其中,std::async函数用于启动一个异步任务(即子线程),接受一个可调用对象作为参数,返回一个Future对象,表示异步任务的未来结果。

2.传递参数

有时候需要在异步任务中传递参数。可以使用std::packaged_task和std::promise来实现。


std::packaged_task<int(int, int)> task([](int x, int y){ return x + y; });

std::future<int> ft = task.get_future();

std::thread t(std::move(task), 2, 3);

t.join();

int result = ft.get();

上述代码中,std::packaged_task是一个可以在任何地方调用的可调用对象,并将其与结果相关联。std::packaged_task的构造函数接收一个函数指针或可调用对象,当进行调用时,该函数或可调用对象将被执行,并返回一个结果。std::packaged_task通过调用其成员函数get_future返回与结果相关联的Future对象。最后,std::thread对象负责执行异步任务,参数通过std::move转移,并调用packaged_task对象,最后用get函数获取最终结果。

3.获取结果

调用Future的get函数可以获取异步任务返回的结果。


std::future<int> ft = std::async([]() return 42; );

int result = ft.get();

std::cout << result << '\n';

4.异常处理

当异步任务执行出错时,可以使用try-catch语句捕获异常。


std::future<void> ft = std::async([]() {

  throw std::runtime_error("error");

});

try {

  ft.get();

} catch (std::exception& e) {

  std::cerr << e.what() << '\n';

}

上述代码中,当异步任务抛出异常后,get函数会将该异常再次抛出,从而使得该异常能够被try-catch语句捕获并处理。

总之,C++ Future是一种非常实用的并发编程工具,使用Future可以方便地实现任务分配、执行和结果获取等功能。熟练掌握Future的使用方法,有利于提高程序的并发性和效率。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复