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的并不关心。

上一篇:把最新青书学堂成教助手软件分享给大家


下一篇:踩坑笔记-setInterval越来越快