谁负责共同的未来和承诺状态

时间:2017-04-13 04:28:53

标签: c++ c++11 promise c++14 future

谁拥有期货和承诺中的共享国家?特别是谁负责构建和删除这些类中的共享状态?或者共享状态应该被引用计数?通过在cppreference上阅读这些文档,我无法得到答案。

我正在考虑的方式最简单的方法是让std::promise类负责创建共享状态,然后将其交给std::future,即{}在未来被销毁时从std::promise获取以进行删除。但是这种方法可能导致悬挂的承诺对象。所以我不确定这两者之间应该分享这个州的真实情况。

例如,下面的代码是否会产生未定义的行为(因为未来被销毁时可能会破坏共享状态)?

auto prom = std::promise<void>{};
{
    auto fut = prom.get_future();
}
prom.set_value();

此外,关于cppreference的std::promise::~promise的文档说“如果共享状态已准备好,则将其释放”,这让我认为共享状态不是引用计数。

1 个答案:

答案 0 :(得分:7)

std::future(或std::promise)被销毁时,会释放其共享状态

This rule指出,当异步返回对象或异步提供程序被称为释放其共享状态时,它会放弃对共享状态的引用。

如果该引用是最后一个,则共享状态将被销毁。

所以是的,共享状态似乎是引用计数而不是,您的代码示例不会产生UB,因为prom仍然保持对共享状态的引用。