std::promise和std::future的用法和示例说明
摘要
本文介绍了C++11标准库中的std::promise和std::future组件,以及它们的使用方式和示例代码。通过使用std::promise和std::future,可以在不同的线程之间传递数据,并且可以实现异步计算和并发执行的功能。
内容
C++11的标准库中提供了std::promise和std::future这两个组件,它们是用于实现在不同线程之间传递数据的机制。通过std::promise和std::future可以实现异步计算和并发执行的功能。
std::promise是一个异步提供者,用于将结果提供给一个共享状态。而std::future是一个异步返回对象,用于从共享状态读取结果。你可以把std::promise理解为另一个端点,而将std::future看作是与之相连的另一个端点。
当我们使用std::promise时,需要注意以下几点:
- 一个std::promise只能与一个std::future关联,不能重复使用。
- 当一个std::promise的std::future被获取时,std::promise会变为active状态,此时std::promise不能被销毁。
- 在std::promise被销毁之前,必须调用set_value或set_exception方法来设置共享状态的值或异常。
- 如果一个std::promise的std::future被获取后,没有设置值或异常,那么调用std::future的get方法会抛出一个"broken promise"异常。
下面是一个示例,演示了如何使用std::promise和std::future实现异步计算和数据传递:
1#include <iostream>
2#include <thread>
3#include <future>
4
5void asyncFunc(std::promise<int>& prom) {
6 // 模拟耗时操作
7 std::this_thread::sleep_for(std::chrono::seconds(2));
8 int result = 10;
9 prom.set_value(result);
10}
11
12int main() {
13 std::promise<int> prom; // 创建一个std::promise对象
14
15 std::future<int> fut = prom.get_future(); // 获取与promise相关联的std::future对象
16
17 std::thread t(asyncFunc, std::ref(prom)); // 启动一个新线程,并将std::promise对象作为参数传递
18
19 std::cout << "Waiting for result..." << std::endl;
20 int result = fut.get(); // 获取future的值,如果promise的值还没有被设置,则会等待
21
22 std::cout << "Result: " << result << std::endl;
23
24 t.join();
25
26 return 0;
27}
总结 通过使用std::promise和std::future,我们可以在不同的线程之间传递数据,并且可以实现异步计算和并发执行的功能。在使用std::promise时,需要注意及时设置共享状态的值或异常,以避免引发"broken promise"异常。希望本文对您理解std::promise和std::future的用法有所帮助。
相关文章推荐
- 在C++中使用`noexcept`
- 使用 'const' 修饰函数参数
- C++-FAQ:类型转换和类型转换规则
- C++中"."运算符和"->"运算符的区别
- 使用Git查看特定文件的更改
- C++中存在头文件和.cpp文件的原因
- 将std::string转换为int的方法