std::future 的用法
时间: 2023-03-27 09:04:08 浏览: 52
std::future 是 C++11 引入的一种异步编程的方式,它可以在一个线程中异步执行一个任务,并在另一个线程中获取任务的结果。使用 std::future 需要先创建一个 std::promise 对象,然后通过 std::promise 的 get_future() 方法获取一个 std::future 对象,再将这个 std::future 对象传递给另一个线程,让它在另一个线程中执行任务并返回结果。在主线程中可以通过 std::future 的 get() 方法获取任务的结果,如果任务还没有完成,get() 方法会阻塞当前线程,直到任务完成并返回结果。
相关问题
std::future用法
std::future是C++11引入的一种机制,用于表示异步操作的结果。它提供了一种在异步任务完成后获取结果的方法,可以在主线程中继续执行其他操作,而不需要等待异步任务的完成。
使用std::future需要先创建一个std::promise对象和一个std::future对象,它们之间通过std::promise的get_future()函数建立关联。然后,将异步任务封装成一个可调用对象(如函数或lambda表达式),使用std::async函数来启动异步任务,并将std::future作为其返回值。
下面是一个简单的示例代码:
```cpp
#include <iostream>
#include <future>
int computeSum(int a, int b) {
return a + b;
}
int main() {
std::promise<int> promiseObj;
std::future<int> futureObj = promiseObj.get_future();
// 启动异步任务
std::future<int> result = std::async(std::launch::async, computeSum, 10, 20);
// 主线程继续执行其他操作
// 获取异步任务的结果
int sum = result.get();
std::cout << "Sum: " << sum << std::endl;
return 0;
}
```
在上述代码中,我们使用std::promise创建了一个promise对象promiseObj,并通过promiseObj的get_future()函数获取一个future对象futureObj。然后,我们使用std::async函数启动了一个异步任务computeSum,并将其返回值作为future对象result。
在主线程中,我们可以继续执行其他操作。当需要获取异步任务的结果时,可以使用future对象的get()函数,它会阻塞主线程直到异步任务完成并返回结果。
请注意,如果异步任务抛出异常,get()函数将会重新抛出该异常,因此在使用get()函数时应该使用try-catch块来处理可能的异常。
std::promise和std::future
std::promise和std::future是C++11中引入的用于实现异步编程的两个重要类。
std::promise用于存储一个值或异常,并将其与std::future对象相关联。通过promise,我们可以将一个值或异常传递给future,然后在需要的时候从future中获取这个值或异常。promise通常由生产者线程使用。
std::future是一个轻量级的异步任务句柄,用于获取异步任务的结果。它提供了一种异步获取值的方式,可以用于等待异步任务的完成并获取其结果。future通常由消费者线程使用。
promise和future之间是一种一对一的关系,一个promise可以和一个future关联,而一个future也只能与一个promise关联。
下面是一个简单的示例代码,演示了promise和future的基本用法:
```cpp
#include <iostream>
#include <thread>
#include <future>
void compute_value(std::promise<int>& p) {
// 假设这里是一个耗时的计算过程
int result = 42;
// 将计算结果设置到promise中
p.set_value(result);
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(compute_value, std::ref(p));
// 等待计算结果就绪并获取
int result = f.get();
std::cout << "Result: " << result << std::endl;
t.join();
return 0;
}
```