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