c++ 中的 std::promise 和 std::future
Posted
技术标签:
【中文标题】c++ 中的 std::promise 和 std::future【英文标题】:std::promise and std::future in c++ 【发布时间】:2014-11-10 19:01:49 【问题描述】: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);
【问题讨论】:
请参阅What is std::promise? 了解更多讨论和简短的演示程序。 【参考方案1】:将promise
和future
视为创建数据的一次性通道。 promise
创建通道,并最终使用promise::set_value
将数据写入通道。 future
连接到通道,future::wait
在数据写入后读取并返回数据。
不用担心,因为将future
与promise
“配对”的唯一方法是与promise::get_future
。
【讨论】:
我已经更新了帖子。示例中没有包含 promise::get_future。 @Decipher 那是因为没有使用future
。没有future
,promise
就毫无用处。 (就像生活一样!)
@Decipher 看future
的定义。公开的构造函数无法让 future
值得等待——默认构造函数基本上只存在于您想稍后为其分配一些其他 future
的情况下。如果你想要future
,你需要从生产者那里得到它,比如promise
。【参考方案2】:
它们由std::promise::get_future
成员函数关联。您可以通过调用此函数获得与std::promise
关联的std::future
。
std::future
表示您尚未拥有但最终会拥有的值。它提供了检查值是否可用或等待它可用的功能。
std::promise
承诺您最终会设置一个值。当一个值最终被设置时,它将通过其对应的std::future
提供。
不,因为您不会在创建后将它们配对。您从 std::promise
获得您的 std::future
,因此它们具有内在联系。
【讨论】:
【参考方案3】:std::promise<class T> promiseObj;
-
promise 对象创建一个可以存储 T 类型值的容器
std::future<class T> futureObj = promiseObj.get_future();
future 对象一旦持有某个值,就会检索由 Promise 对象创建的容器中的内容。一个future对象需要与promise对象创建的容器相关联,这可以通过上面的sn-p来完成。 因此,如果您将未来与预期的承诺对象相关联,那么未来不应该与错误的承诺对象配对。
这是一个示例程序,可以清楚地说明未来承诺的用法:
#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;
【讨论】:
以上是关于c++ 中的 std::promise 和 std::future的主要内容,如果未能解决你的问题,请参考以下文章
C++ std::future与promise(异步回调异步调用)
C++ std::future与promise(异步回调异步调用)
为啥 MinGW 中仍然没有 std::thread、std::promise 和 std::future? win32中promise和futures的替代方案是啥?