状态就绪时立即销毁 std::promise

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

考虑以下代码:

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 析构函数,这似乎是无效的。

根据我的经验,我知道上面的代码应该可以完美运行,至少在我体验过的平台上是这样。但是你能说出一些东西来表明这段代码已经定义了行为吗?

c++ promise std future destructor
1个回答
1
投票

你错误地使用了 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。如果两个线程同时修改同一个对象,你就有麻烦了。

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