C++ 并发支持库包括 std::future 类模板,该模板自 C++11 起可用。该模板在 <future> 标头中定义,并提供访问异步操作结果的方法。
C++ 中的 std::future 是什么?
在 C++ 中,std::future 是一个类模板,用于接收尚未计算的异步执行任务的结果,即未来值。 C++ 中的异步操作使用 std::async、std::packaged_task 或 std::promise 进行管理,后者返回 std::future 对象。我们可以使用这个 std::future 对象来验证、等待或获取操作的结果。
需要注意的是,我们在程序中只能接收一次计算结果,因为在获得结果后会重置未来的状态。
std::future 的语法
定义 std::future 对象的语法非常简单:
std::future<type> name;
其中,
- name:未来对象的名称。
- type:要接收的数据类型。
std::future 类中的成员函数
std::future 类由提供基本函数的各种成员函数组成。一些常见的有:
S. No. |
Function |
Description |
---|---|---|
1 |
get() | 获取收到的值的函数。 |
2 |
wait() | 该函数告诉编译器wait()来完成该过程。 |
3 |
wait_for() | 此函数告诉编译器 wait() 在指定的持续时间内完成进程。 |
4 |
wait_until() | 该函数告诉编译器 wait() 直到指定的持续时间完成该过程。 |
5 |
valid() | 该函数检查future()对象是否具有共享状态,即执行get()操作是否有效。 |
C++ 中 std::future 的示例
示例1:使用std::future打印异步任务的返回值
C++
// C++ Program to illustrate the use of std::future
#include <chrono>
#include <future>
#include <iostream>
using namespace std;
// A simple function that returns some integer value
int returnTwo() { return 2; }
// driver code
int main()
{
// creating a future object and a thread that executes
// the function return two asynchronously
future<int> f = async(launch::async, returnTwo);
// getting and printing the result
cout << f.get();
return 0;
}
输出
2
示例 2:尝试从 std::future 多次获取值
C++
// C++ Program to illustrate the use of std::future
#include <chrono>
#include <future>
#include <iostream>
using namespace std;
// A simple function that returns some integer value
int returnTwo() { return 2; }
// driver code
int main()
{
// creating a future object and a thread that executes
// the function return two asynchronously
future<int> f = async(launch::async, returnTwo);
// getting and printing the result
cout << f.get();
// trying for second time
cout << f.get();
return 0;
}
输出
terminate called after throwing an instance of 'std::future_error' what(): std::future_error: No associated state
上述问题的解决方案是在使用get()方法之前使用future::valid()函数检查未来对象的状态。
示例 3:使用 valid() 避免无关联状态错误
C++
// C++ Program to illustrate the use of std::future
#include <chrono>
#include <future>
#include <iostream>
using namespace std;
// A simple function that returns some integer value
int returnTwo() { return 2; }
// driver code
int main()
{
// creating a future object and a thread that executes
// the function return two asynchronously
future<int> f = async(launch::async, returnTwo);
// getting and printing the result
if (f.valid()) {
cout << f.get() << endl;
}
else {
cout << "Invalid State, Please create another Task"
<< endl;
}
// trying for second time
if (f.valid()) {
cout << f.get() << endl;
}
else {
cout << "Invalid State, Please create another Task"
<< endl;
}
return 0;
}
输出
2 Invalid State, Please create another Task
除了 async() 方法之外,我们还可以使用 std::packaged_task() 和 std::promise( 来获取 future 对象。下面的示例演示了 std::future 与 std::promise 的使用。
示例 4:将 std::future 与 std::promise 一起使用
C++
// C++ Program to illustrate the use of std::future
#include <chrono>
#include <future>
#include <iostream>
using namespace std;
// A simple function that returns some integer value
void foo(promise<int> p) { p.set_value(25); }
// driver code
int main()
{
// creating a future object and a thread that executes
// the function return two asynchronously
promise<int> p;
future<int> f = p.get_future();
;
// moving the task
thread t(foo, move(p));
t.join();
cout << f.get();
return 0;
}
输出
25
结论
std::future为程序员提供了一种简单的方式在C++异步编程中进行线程通信的方法。当我们需要在后台执行某些任务并需要在主进程中获得该任务的结果时,它特别有用。
相关用法
- C++ std::fill()用法及代码示例
- C++ std::fill_n()用法及代码示例
- C++ std::find()用法及代码示例
- C++ std::find_first_of()用法及代码示例
- C++ std::for_each()用法及代码示例
- C++ std::find用法及代码示例
- C++ std::find_end用法及代码示例
- C++ std::find_first_of用法及代码示例
- C++ std::forward_list::sort()用法及代码示例
- C++ std::front_inserter用法及代码示例
- C++ std::fstream::close()用法及代码示例
- C++ std::accumulate()用法及代码示例
- C++ std::binary_search()用法及代码示例
- C++ std::copy()用法及代码示例
- C++ std::copy_if()用法及代码示例
- C++ std::copy_n()用法及代码示例
- C++ std::lower_bound()用法及代码示例
- C++ std::max()用法及代码示例
- C++ std::max_element()用法及代码示例
- C++ std::min()用法及代码示例
- C++ std::min_element()用法及代码示例
- C++ std::minmax()用法及代码示例
- C++ std::next_permutation()用法及代码示例
- C++ std::nth_element()用法及代码示例
- C++ std::replace()用法及代码示例
注:本文由纯净天空筛选整理自saurabh1975大神的英文原创作品 std::future in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。