2012-03-16 11 views
17

Tengo algunas dudas sobre el comportamiento de std::async función con std::launch::async política & std::future objeto devuelto por asíncrona.el comportamiento de std :: asíncrono con la política std :: :: lanzamiento asíncrono

En el siguiente código, el hilo principal espera la finalización de foo() en el hilo creado por async llamada.

#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é http://www.stdthread.co.uk/doc/headers/future/async.html dice

El destructor del último objeto futuros asociados con el estado asíncrona de la std :: regresado futuro 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?
+0

Lo que es tan sorprendente acerca del estándar es que a menudo una nota al pie cambia por completo un capítulo ... – orlp

Respuesta

16

Sí, esto es requerido por el estándar C++. 30.6.8 [futures.async] párrafo 5, última viñeta:

- la realización de procesos asociado sincroniza con (1.10) el retorno de la primera función que detecta correctamente el estado de preparado del estado compartido o con el regreso desde la última función que libera el estado compartido, lo que ocurra primero.

El destructor de la única y única std:future satisface esa condición, por lo que debe esperar la finalización de la secuencia.

+1

El código de OP NO funciona igual para VS2012. No bloquea el destructor 'future'. ¿Es algún tipo de error, o Microsoft simplemente aceptó la propuesta de Sutter de no bloquear los indicadores? –

+0

Microsoft eligió implementar la propuesta de Herb Sutter para no bloquear en destructores. –

+0

Este comportamiento es un gran problema, pero me temo que es demasiado tarde para arreglar el estándar. Microsoft decidió implementar un comportamiento no estándar porque no están de acuerdo con él, lo que dificulta la vida de los desarrolladores multiplataforma. – cdmh