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&lt;&gt;::get() 的预期行为吗?这是“我只有一​​次”的场景吗?我在documentation 中没有找到任何内容。

【问题讨论】:

你在找std::shared_future 是的,这是设计的行为。在您链接到的页面中,请特别注意valid 状态及其变化方式。 【参考方案1】:

来自std::future&lt;T&gt;::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

std::future, std::async, std::promise

std::future, std::async, std::promise