C++笔记之std::future的用法
code review!
文章目录
- C++笔记之std::future的用法
- 1.C++中std::future和std::async总是一起出现吗?
- 2.主要特点和用法
- 3.一个完整的例子
- 4.std::future 存放的是一个结果吗?
- 5.cppreference——std::future
1.C++中std::future和std::async总是一起出现吗?
在C++中,std::future
和 std::async
不一定总是一起出现,但它们通常一起使用,以实现异步任务的执行和结果获取。以下是它们的主要概念和用法:
-
std::future
:std::future
是用于异步操作的结果的容器。它允许您在一个线程中启动一个任务,并在另一个线程中等待任务的结果。- 您可以将结果存储在
std::future
对象中,并随后从中获取结果。 std::future
可以用于异步执行的任何任务,不仅限于与std::async
一起使用。
-
std::async
:std::async
是一个函数,用于在后台启动一个异步任务,并返回一个std::future
对象,以便您可以等待任务的结果。- 它允许您以一种相对简单的方式启动异步任务,而无需自己创建线程或管理任务的执行。
std::async
是std::future
的一个典型使用情况。
虽然 std::async
和 std::future
经常一起使用,但您也可以单独使用 std::future
来等待其他异步任务的结果,这些任务可能是通过其他方法创建的,例如手动创建线程、使用库函数等。std::async
只是一种使用 std::future
的便捷方法之一。
综上所述,std::future
和 std::async
通常一起使用,但它们并不是必然绑定在一起的,您可以根据具体情况单独使用它们。
2.主要特点和用法
std::future
是C++标准库中用于处理异步任务的一部分,它提供了一种机制,可以在一个线程中启动一个任务,并在另一个线程中等待任务的完成并获取其结果。std::future
通常与std::async
、std::promise
和std::thread
等标准库组件一起使用,以实现多线程编程和异步任务处理。
以下是std::future
的主要特点和用法:
-
创建std::future对象:
你可以使用std::async
或std::promise
来创建std::future
对象。std::async
用于启动一个异步任务,而std::promise
用于生成一个与之关联的std::future
对象,它允许你在一个线程中设置任务的结果,然后在另一个线程中获取这个结果。示例使用
std::async
创建std::future
:std::future<int> future_result = std::async(std::launch::async, []() {// 执行异步任务,返回一个int结果return 42; });
-
等待任务完成:
你可以使用std::future::get()
函数来等待异步任务的完成,并获取其结果。这个函数会阻塞当前线程,直到任务完成为止。示例使用
std::future::get()
等待任务完成并获取结果:int result = future_result.get();
-
检查任务状态:
使用std::future::wait_for()
函数可以检查std::future
的状态,以确定任务是否已经完成或是否还在进行中。示例检查
std::future
的状态:std::future_status status = future_result.wait_for(std::chrono::seconds(1)); if (status == std::future_status::ready) {// 任务已完成 } else if (status == std::future_status::timeout) {// 任务尚未完成,等待超时 } else if (status == std::future_status::deferred) {// 任务被延迟执行 }
-
异常处理:
如果异步任务抛出异常,std::future::get()
会重新抛出该异常。你可以使用std::future::valid()
函数来检查std::future
是否与有效的共享状态相关联。示例处理异步任务中的异常:
try {int result = future_result.get();// 处理结果 } catch (const std::exception& e) {// 处理异常 }
std::future
是多线程和异步编程中非常有用的工具,它允许你管理异步任务的状态和结果,从而更有效地利用多核处理器和并行计算能力。但要小心使用,确保正确处理异常和资源管理,以避免潜在的问题。
3.一个完整的例子
std::future
是C++标准库中用于处理异步任务的一部分,它提供了一种机制,可以在一个线程中启动一个任务,并在另一个线程中等待任务的完成并获取其结果。std::future
通常与std::async
、std::promise
和std::thread
等标准库组件一起使用,以实现多线程编程和异步任务处理。
以下是std::future
的主要特点和用法:
-
创建std::future对象:
你可以使用std::async
或std::promise
来创建std::future
对象。std::async
用于启动一个异步任务,而std::promise
用于生成一个与之关联的std::future
对象,它允许你在一个线程中设置任务的结果,然后在另一个线程中获取这个结果。示例使用
std::async
创建std::future
:std::future<int> future_result = std::async(std::launch::async, []() {// 执行异步任务,返回一个int结果return 42; });
-
等待任务完成:
你可以使用std::future::get()
函数来等待异步任务的完成,并获取其结果。这个函数会阻塞当前线程,直到任务完成为止。示例使用
std::future::get()
等待任务完成并获取结果:int result = future_result.get();
-
检查任务状态:
使用std::future::wait_for()
函数可以检查std::future
的状态,以确定任务是否已经完成或是否还在进行中。示例检查
std::future
的状态:std::future_status status = future_result.wait_for(std::chrono::seconds(1)); if (status == std::future_status::ready) {// 任务已完成 } else if (status == std::future_status::timeout) {// 任务尚未完成,等待超时 } else if (status == std::future_status::deferred) {// 任务被延迟执行 }
-
异常处理:
如果异步任务抛出异常,std::future::get()
会重新抛出该异常。你可以使用std::future::valid()
函数来检查std::future
是否与有效的共享状态相关联。示例处理异步任务中的异常:
try {int result = future_result.get();// 处理结果 } catch (const std::exception& e) {// 处理异常 }
std::future
是多线程和异步编程中非常有用的工具,它允许你管理异步任务的状态和结果,从而更有效地利用多核处理器和并行计算能力。但要小心使用,确保正确处理异常和资源管理,以避免潜在的问题。
4.std::future 存放的是一个结果吗?
是的,std::future
存放的是一个异步任务的结果。异步任务完成后,你可以使用std::future::get()
方法来获取任务的结果。这个方法会等待任务完成,然后返回结果。
在前面的示例中,std::async
启动了一个异步任务,该任务返回整数值42。我们使用std::future
对象来获取这个结果,如下所示:
std::future<int> future_result = std::async(std::launch::async, []() {// 模拟一个耗时操作,返回一个结果std::this_thread::sleep_for(std::chrono::seconds(2));return 42;
});// 使用std::future::get()等待任务完成并获取结果
int result = future_result.get();
在这里,future_result.get()
等待任务完成,并返回42作为结果,我们将其存储在result
变量中。
所以,std::future
是一种用于异步任务结果的容器,它允许你在一个线程中启动任务,在另一个线程中获取任务的结果。