C++11 future中std::promise 介绍
前面两讲《C++11 并发指南二(std::thread 详解) 》,《C++11 并发指南三(std::mutex 详解) 》分别介绍了 std::thread 和 std::mutex,相信读者对 C++11 中的多线程编程有了一个最基本的认识,本文将介绍 C++11 标准中 <future> 头文件里面的类和相关函数。 <future> 头文件中包含了以下几个类和函数: Providers 类:std::promise, std::package_task Futures 类:std::future, shared_future. Providers 函数:std::asyn `std::promise` 是 C++11 引入的一个核心并发工具,它是 `<future>` 头文件中的关键组件,用于在线程间传递数据。在多线程编程中,`std::promise` 提供了一个安全的方式来设置一个值,这个值可以在另一个线程中通过 `std::future` 或 `shared_future` 访问。`std::promise` 是一个异步提供者,而 `std::future` 和 `shared_future` 则是接收者。 `std::promise` 的主要功能和特性包括: 1. **创建与关联**: 你可以通过默认构造函数创建一个 `std::promise` 对象,这会初始化一个空的共享状态。你可以通过调用 `get_future()` 来获取与 `std::promise` 关联的 `std::future` 对象,这样两者就共享了同一个状态,允许你在一个线程中设置值,而在另一个线程中获取。 2. **设置值**: 你可以使用 `set_value()` 函数将一个值存储到 `std::promise` 的共享状态中。一旦值被设置,与之关联的 `std::future` 就可以获取这个值。如果值已经被设置,再次调用 `set_value()` 会导致未定义行为。 3. **异常处理**: 如果在设置值时发生异常,可以使用 `set_exception()` 方法将异常信息放入共享状态。同样,`set_value_at_thread_exit()` 可以在当前线程结束时设置值,如果线程提前结束,可以避免丢失数据。 4. **内存分配**: `std::promise` 提供了带有自定义分配器的构造函数,允许你控制共享状态的内存管理。 5. **非拷贝性**: `std::promise` 不支持拷贝构造函数和赋值操作,但支持移动构造函数和移动赋值操作。这意味着 `std::promise` 对象不能被复制,只能通过移动来传递所有权。 6. **生命周期管理**: `std::promise` 的生命周期必须小心管理,因为当其销毁时,与其关联的 `std::future` 不能再获取值。如果在 `std::future` 获取值之前销毁了 `std::promise`,则 `std::future.get()` 会抛出一个异常。 7. **异步操作**: `std::promise` 常常与 `std::async` 配合使用,后者可以异步地启动一个任务,并返回一个 `std::future`,这个 `std::future` 可以用来获取任务的结果。 8. **状态检查**: `std::future` 提供了 `valid()`、`ready()` 和 `wait_for()`/`wait_until()` 等方法来检查或等待共享状态的完成状态。 下面是一个使用 `std::promise` 和 `std::future` 进行线程间通信的简单示例: ```cpp #include <iostream> #include <future> void async_function(std::promise<int>& prom) { // 在这里执行耗时操作 int result = compute_something_expensive(); prom.set_value(result); } int main() { std::promise<int> prom; std::future<int> fut = prom.get_future(); std::thread worker(async_function, std::ref(prom)); int computed_value = fut.get(); // 等待结果并获取 worker.join(); std::cout << "Computed value: " << computed_value << '\n'; return 0; } ``` 在这个例子中,主线程创建了一个 `std::promise` 和一个与之关联的 `std::future`。然后,它启动了一个新线程执行 `async_function`,这个函数会设置 `std::promise` 的值。主线程通过 `std::future` 等待并获取结果。 理解 `std::promise` 和 `std::future` 的工作原理对于编写高效的并发程序至关重要,它们是 C++11 为多线程环境提供的强大工具。正确使用这些工具,开发者可以构建出能够充分利用多核处理器能力的复杂并发应用程序。
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![uml](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![xmind](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/release/download_crawler_static/13739944/bg1.jpg)
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 6
- 资源: 963
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 打包和分发Rust工具.pdf
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
- C语言-leetcode题解之第166题分数到小数.zip
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)