运行如下代码
void main() {
// 临时future对象将在语句结束时销毁
std::async(std::launch::async, []{
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Async task completed\n";
});
std::cout << "Function continues\n";
}
在这个代码里,你会惊讶地发现 "Function continues" 会在2秒后才输出,而不是立即输出,为什么?
标准规定 (C++11及以上),当从 std::async 返回的 future 对象被销毁时:如果这是最后一个引用该共享状态的 future,且异步任务还未完成,则析构函数会阻塞等待任务完成。
设计成这样主要是为了以下的思考
异常安全:确保异步任务中的异常不会被无声丢弃
资源管理:防止任务未完成时资源提前释放
确定性:避免程序退出时仍有后台线程运行
保存future对象
std::future<void> taskFuture; // 成员变量或长期存在的对象
void startAsyncTask() {
taskFuture = std::async(std::launch::async, []{
// 长时间运行的任务
});
// future生命周期延长,不会立即阻塞
}