c++ - 未来超出范围,而承诺仍然存在
问题描述
如果我在未来使用 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 已经超出了范围。
解决方案
推荐阅读
- php - 如何在 php 7.2 中设置 mongodb 环境
- angular - 如果在生产环境中,如何仅启用错误日志记录?
- r - 在矩阵中查找有序位置
- jenkins - 詹金斯无法加载到本地主机
- javascript - NodeJS 服务器端在本地工作,但不在 Heroku 上
- reactjs - MUI:避免排版组件之间的换行
- angular - Angular 6:根据 URL 参数更改组件的内容,内容更改滞后
- java - 如何将spring mvc项目与angular 2集成?
- ignite - 如何使用 Apache Ignite.NET 瘦客户端连接到特定网格
- java - Java - Why void when I'm storing value in variable