Подтвердить что ты не робот

Поведение std:: async с помощью std:: launch:: async policy

У меня есть вопрос о поведении функции 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 - да, какие утверждения говорят, что?
4b9b3361

Ответ 1

Да, это требуется стандарту С++. 30.6.8 [futures.async], пункт 5, окончательный вариант:

- связанное завершение потока синхронизируется с (1.10) возвратом от первой функции, которая успешно обнаруживает состояние готовности общего состояния или с возвратом из последней функции, которая освобождает общее состояние, в зависимости от того, что произойдет раньше.

Деструктор единственного std:future удовлетворяет этому условию и поэтому должен ждать завершения потока.