考虑以下代码:
void runSomething() {
std::promise<void> promise;
startWorkAndCallBackFromDifferentThread([&]{
promise.set_value();
});
promise.get_future().get();
}
此代码显示了一种异步函数的包装器,该函数在异步作业完成时调用 lambda。启动异步作业后,外部函数等待未来准备就绪,然后退出。当异步作业完成时,未来将通过 set_value() 调用准备就绪。
我的问题是,这个代码有效吗?因为显然,未来的 get() 函数可能会在未来的状态准备就绪时立即返回,然后再返回 promise 的 set_value() 函数。这意味着可能会在 promise 对象的 set_value() 结束之前调用 promise 析构函数,这似乎是无效的。
根据我的经验,我知道上面的代码应该可以完美运行,至少在我体验过的平台上是这样。但是你能说出一些东西来表明这段代码已经定义了行为吗?
你错误地使用了 promise。你应该先从承诺中得到未来。之后,承诺对接收端没有用,但可以从:
void runSomething() {
std::promise<void> promise;
auto fut = promise.get_future();
startWorkAndCallBackFromDifferentThread([p = std::move(promise)]() mutable {
p.set_value();
});
fut.get();
}
promise
并不意味着共享。共享状态由 future
. 管理
std::promise
并不像你想象的那么special。如果两个线程同时修改同一个对象,你就有麻烦了。