【发布时间】:2017-03-01 14:30:45
【问题描述】:
像std::mutex 那样将std::promise<T> 变成mutable 是否安全,还是取决于T?如:
using Data = std::tuple<bool, int, int>;
struct X {
std::future<Data> prepare() const {
return m_promise.get_future();
}
void asyncHandler(int a, int b) const {
m_promise.set_value({true, a, b});
}
void cancel() const {
m_promise.set_value({false, 0, 0});
}
mutable std::promise<Data> m_promise; // Is this safe?
};
void performAsyncOp(const X& x) {
std::future<Data> fut = x.prepare();
dispatch(x);
std::future_status result = fut.wait_for(std::chrono::milliseconds(150));
if (result == std::future_status::timeout) {
x.cancel();
}
handleResult(fut.get());
}
【问题讨论】:
-
事实证明,由于期货不可重置,这种模式无论如何都被打破了。我原以为 future.get() 会重置它,但事实并非如此。我真的很难看到所有这些承诺/未来的东西的意义。
标签: c++ c++11 asynchronous promise