tutorial threads thread pthread_create multi ejemplo algorithms c++ multithreading c++11

threads - thread linux c++



el comportamiento de std:: async con std:: launch:: async policy (1)

Tengo algunas preguntas sobre el comportamiento de la función std::async con std::launch::async policy & std::future objeto devuelto desde async.

En el siguiente código, el hilo principal espera la finalización de foo() en el hilo creado por una llamada 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; }

Y sé que http://www.stdthread.co.uk/doc/headers/future/async.html dice

El destructor del último objeto futuro asociado con el estado asíncrono del std :: future devuelto se bloqueará hasta que el futuro esté listo.

Mi pregunta es:

  • Q1. ¿Este comportamiento se ajusta al estándar actual de C ++?
  • Q2. Si la respuesta de Q1 es sí, ¿qué afirmaciones dicen eso?

Sí, esto es requerido por el estándar de C ++. 30.6.8 [futures.async] párrafo 5, punto final:

- la terminación de la hebra asociada sincroniza con (1.10) el retorno de la primera función que detecta con éxito el estado listo del estado compartido o con el retorno de la última función que libera el estado compartido, lo que ocurra primero.

El destructor del único e std:future satisface esa condición, por lo que debe esperar a que se complete el subproceso.