У меня есть вопрос о поведении функции std::async
с политикой std::launch::async
и std::future
объект, возвращенный из async.
В следующем коде основной поток ожидает завершения foo()
в потоке, созданном вызовом async
.
#include <thread>
#include <future>
#include <iostream>
void foo()
{
std::cout << "foo:begin" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "foo:done" << std::endl;
}
int main()
{
std::cout << "main:begin" << std::endl;
{
auto f = std::async(std::launch::async, foo);
// dtor f::~f blocks until completion of foo()... why??
}
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "main:done" << std::endl;
}
И я знаю http://www.stdthread.co.uk/doc/headers/future/async.html говорит
Деструктор последнего будущего объекта, связанного с асинхронное состояние возвращаемого std:: future должно блокироваться до тех пор, пока будущее готово.
Мой вопрос:
- Q1. Соответствует ли это поведению текущему стандарту С++?
- Q2. Если ответ Q1 - да, какие утверждения говорят, что?