首页 > 解决方案 > 未来超出范围,而承诺仍然存在

问题描述

如果我在未来使用 wait_for 会发生什么,由于超时而超出范围,然后 set_value 在承诺上被调用?如果它未定义,那将毫无意义,但是,我想确定并且没有找到我自己的答案。下面的示例代码

#include <future>
#include <iostream>
#include <thread>


void task1() {
    std::promise<void> promise;
    auto futureOutOfScopeWork = [&promise]() {
        std::future<void> future = promise.get_future();
        auto status = future.wait_for(std::chrono::milliseconds(500));
        if (status == std::future_status::ready) {
            std::cout << "in time" << std::endl;
        } else if (status == std::future_status::timeout) {
            std::cout << "timeout" << std::endl;
        } else {
            std::cout << "invalid state" << std::endl;
        }
    };  

    std::thread futureThread(futureOutOfScopeWork);
    futureThread.detach();
    std::this_thread::sleep_for(std::chrono::milliseconds(750));
    promise.set_value();
}



int main() {

    std::thread startEverything(task1);
    startEverything.detach();
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}

startEverythring 线程启动一个承诺。startEverything 然后启动另一个线程,该线程在 promise 上调用 get_future。然后由于超时,未来会超出范围。我在这里遇到未定义的行为吗?get_future 被调用,future 被销毁,并且 set_value 在一个 promise 中调用,其链接的 future 已经超出了范围。

标签: c++multithreadingpromisesynchronizationfuture

解决方案


推荐阅读