IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++-std::promise基本使用 -> 正文阅读

[C++知识库]C++-std::promise基本使用

promise

std::promise<T>是一个模板类,提供了set_value方法,可以设置相关联的future的值,相关联的future对象通过get_future方法获取。如果一个promise对象没有调用set_value就被销毁,关联的future的get调用将会抛出异常。

future<int> f;
{
	promise<int> p;
	f = p.get_future();
}
cout << f.get()<< endl;

以上代码将在f.get()处抛出异常

#include <future>
void process_connections(connection_set &connections)
{
    while (!done(connections))
    {
        for (connection_iterator
                 connection = connections.begin(),
                 end = connections.end();
             connection != end;
             ++connection)
        {
            if (connection->has_incoming_data())
            {
                data_packet data = connection->incoming();
                std::promise<payload_type> &p =
                    connection->get_promise(data.id);
                p.set_value(data.payload);
            }
            if (connection->has_outgoing_data())
            {
                outgoing_packet data =
                    connection->top_of_outgoing_queue();
                connection->send(data.payload);
                data.promise.set_value(true);
            }
        }
    }
}

process_connections运行在单独的线程中,处理网络连接的数据发送和接收,我们可以想象还有另一个线程,当要接收数据时,通过data.id获取到关联的promise,再通过promise.get_future获取future对象,再调用future::get获取接收的payload_type类型数据;当要发送数据时,准备好data.payload,并通过data.promise.get_future获取future对象,再调用future::get获取bool类型的值,判断是否成功发送数据。

promise正如其名字,是一个承诺,承诺与其关联的future调用get等待最终将会得到一个T类型的值(T是promise的模板参数),如果得到值之前(即promise调用set_value之前)promise就被销毁,那么get处将会发生异常。
这么来看是不是和情侣之间的“承诺”有点像?爱情开始给了对方一个承诺,于是对方相信了,并且等啊等,等着承诺实现的那一天,结果做出承诺的这个人把这个承诺遗忘了,于是对方感觉很生气,最终导致两个人分手了。

promise与前面的packaged_task的不同之处在于,它不需要指定一个函数或者可调用对象来得到结果,而是通过关联的promise和future,让需要这个结果的线程最终能获取到结果,至于是谁通过什么方式最终把值传入set_value的并不关心。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 11:51:13  更:2021-12-07 11:51:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:45:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码