std :: promise提供了一种设置值(类型为T)的方法 以后可以通过关联的std :: future对象
来读取
这两者究竟有何联系?
我的担忧是否合理,未来会与错误的承诺配对?
更新:来自行动中的并发的示例...(但代码无法编译)
#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);
}
}
}
}
答案 0 :(得分:4)
将promise
和future
视为为数据创建一次性使用渠道。 promise
创建频道,并最终使用promise::set_value
将数据写入其中。 future
连接到频道,future::wait
会在数据写入后读取并返回数据。
没有真正关心,因为唯一的方式是&#34;配对&#34;带有future
promise
的{{1}}与promise::get_future
。
答案 1 :(得分:2)
它们由std::promise::get_future
成员函数关联。您可以通过调用此函数获得与std::future
相关联的std::promise
。
std::future
表示您尚未拥有但最终会拥有的值。它提供了检查值是否可用的功能,或等待它可用的功能。
std::promise
承诺您最终会设置一个值。最终设置一个值时,它将通过相应的std::future
。
不,因为您在创建后不会将它们配对。您从std::future
获得std::promise
,因此它们本身就是相关联的。
答案 2 :(得分:0)
std::promise<class T> promiseObj;
std::future<class T> futureObj = promiseObj.get_future();
将来的对象只要具有一定的价值,就会检索promise对象创建的容器中的内容。将来的对象需要与Promise对象创建的容器相关联,这可以通过上面的代码段完成。 因此,如果您将future与预期的promise对象关联,那么就不会出现future与错误的promise对象配对的情况。
这是一个示例程序,可以明确说明将来的用法:
#include <iostream>
#include <thread>
#include <future>
//Some Class will complex functions that you want to do in parallel running thread
class MyClass
{
public:
static void add(int a, int b, std::promise<int> * promObj)
{
//Some complex calculations
int c = a + b;
//Set int c in container provided by promise
promObj->set_value(c);
}
};
int main()
{
MyClass myclass;
//Promise provides a container
std::promise<int> promiseObj;
//By future we can access the values in container created by promise
std::future<int> futureObj = promiseObj.get_future();
//Init thread with function parameter of called function and pass promise object
std::thread th(myclass.add, 7, 8, &promiseObj);
//Detach thread
th.detach();
//Get values from future object
std::cout<<futureObj.get()<<std::endl;
return 0;
}