重复调用std::future::get

calling std::future::get repeatedly

本文关键字:future get std 调用      更新时间:2023-10-16

我想异步构造一个对象Delay,然后(从另一个线程)从该对象重复调用函数foo

struct Delay {
    Delay(int d) {
        sleep(d);
    }
    void foo() { }
};
struct Test {
    Test() {
        x = async(std::launch::async,
                  [&]() {return std::make_unique<Delay>(4);});
    }
    void run() { x.get()->foo(); }
    std::future<std::unique_ptr<Delay>> x;
};
int main() {
    auto t = Test();
    // do other stuff...
    t.run();
    t.run(); // throwing an instance of 'std::future_error',  "No associated state"
    return 0;
}

然而,很明显,第二次调用x.g get()时,抛出一个异常。

处理这种情况的建议方法是什么?使用如下所示的标志似乎是一种hack。有没有更好的办法?

bool is_set = false;
std::unique_ptr<Delay> ptr;
void run_ptr() {
    if (!is_set) {
        ptr = x.get();
        is_set = true;
    }
    ptr->out();
}
建议使用

std::shared_future

它可以通过从未来移动来构造,并且支持其状态的多个读取器。它是一个独特的对象,因为一次交付的未来有一定的性能改进,因为如果你需要的话,创建一个共享的未来是如此的微不足道。

只需将x的类型更改为shared_future<std::unique_ptr<Delay>>,您就完成了。

但是,请注意,在上面的情况下,unique_ptr层几乎没有意义。