重复调用std::future::get
calling std::future::get repeatedly
我想异步构造一个对象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
层几乎没有意义。
相关文章:
- Cpp-Tuple使用带有变量的get
- 架构决策:返回std::future还是提供回调
- 使用用户定义的参数调用future/async并调用类方法
- 通过 get-Method 访问变量在类外不起作用
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- std::future::get()或std::future::wait()是std::thread::join()的替
- 为什么printf会导致与future.get的死锁,而cout则不会?
- 在 std::future::unwrap() 和 std::future::get() 中竞争
- 线程是否真的在调用 std::future::get() 后启动
- 是否可以在调用 future.get() 之前销毁 std::p romise ?
- 程序在使用异步的 Boost.Process 调用 std::future.get() 后挂起
- C++ bad_alloc future.get 上的例外
- c ++如何使我.get() std::future out of a vector.
- std::future.get() 多个调用(来自不同的线程)
- 为什么即使我使用 std::future::get 也需要加入线程
- std::future.get()有时会卡在osx中
- Visual C++ future.get() 返回类型
- 重复调用std::future::get
- 为什么我可以多次调用boost::unique_future::get,而不像std::future