std::future<>::get 清空结果
Posted
技术标签:
【中文标题】std::future<>::get 清空结果【英文标题】:std::future<>::get empties the result 【发布时间】:2020-02-19 21:23:01 【问题描述】:我有一个线程函数可以返回外部 IP,并认为我可以将它与 std::future
一起使用:
std::future<std::string> GetIP4;
GetIP4 = std::async([]() -> std::string
return GetWanIP();
);
稍后在我调用GetIP4.get()
的代码中,我得到一个std::string
。但是这会清空对象,所以下次我尝试从另一个线程调用 get
时它会崩溃。
这是std::future<>::get()
的预期行为吗?这是“我只有一次”的场景吗?我在documentation 中没有找到任何内容。
【问题讨论】:
你在找std::shared_future
是的,这是设计的行为。在您链接到的页面中,请特别注意valid
状态及其变化方式。
【参考方案1】:
来自std::future<T>::get
上的 cppreference:
任何共享状态都被释放。
valid()
是调用此方法后的false
。
之前提到过
如果在调用此函数之前
valid()
是false
,则行为未定义。
由于valid()
必须是true
才能调用get()
和get()
导致valid()
变成false
,所以不可能get()
同一个future
结果不止一次.
【讨论】:
但这是否被视为共享状态? 共享状态是指该值的单个生产者和单个消费者共享的状态。以上是关于std::future<>::get 清空结果的主要内容,如果未能解决你的问题,请参考以下文章
如何将 std::future<T> 转换为 std::future<void>?
记录一个std::future和std::async的demo
std::asyncstd::futurestd::packaged_taskstd::promise
std::future, std::async, std::promise