std::future 设置为“空”状态 c++

问题描述 投票:0回答:1

sr.tFuture
初始化为“空”状态而不是“挂起”状态,我发现当我从构造函数初始化列表中删除
tFuture()
时,
sr.tFuture
的状态变为挂起,这是正确的。但我不太明白其中的原因。是否是因为当
tFuture
被调用时,声明部分的
tFuture()
的值被覆盖,导致
tFuture
无法与任何 Promise 关联?

struct SharedResource
{
    SharedResource(const SharedResource&) = delete;
    SharedResource& operator=(const SharedResource&) = delete;
    SharedResource() :
        tPromise(), tFuture()
        {}

    std::promise<void> tPromise;
    std::future<void> tFuture = tPromise.get_future();
};

int main()
{
    SharedResource sr;
}
c++ promise concurrency std-future
1个回答
0
投票

这个答案只是试图总结对问题中发布的问题的总体理解和解决方案,主要来源于françois-andrieux的评论。


首先,进行一些澄清。

  • OP 所指的“空”未来更好地称为默认构造或无效未来,即不指代有效共享状态的未来。 Future 不是以这种方式创建的,而是从异步提供者(如
    std::promise
    std::packaged_task
    std::async
    )检索。
  • OP 所指的“待定”未来是指具有尚未准备就绪的有效共享状态的未来。也就是说,已从 Promise 中检索到 Future,但 Promise 尚未在共享状态上设置值或异常。这是创造有效未来的正确方法。

问题中观察到的令人困惑的行为是

  • 在一种情况下,未来是从构造函数初始值设定项列表初始化的,未来将默认构造为无效未来,如
    tFuture()
  • 在另一种情况下,从构造函数初始值设定项列表中删除
    tFuture()
    ,它会从默认初始值设定项初始化为
    tPromise.get_future();

第一种情况设置了一个无效的未来,OP将其称为“空”,而第二种情况设置了一个正确的有效未来。

© www.soinside.com 2019 - 2024. All rights reserved.