std :: async tiene una sobrecarga que toma una política std :: launch como primer argumento. ¿Cuándo debería usar esta sobrecarga? ¿Cuáles son las diferentes políticas disponibles? (Creo que la sincronización y la asincrónica son las dos opciones). ¿Cuándo debería usar la política de sincronización? ¿Cómo es eso diferente de ejecutarlo directamente?¿Cuándo debería usar std :: async con sync como política?
Respuesta
Resumen de the very helpful article that Jagannath linked, y comentarios sobre los posibles usos.
Hay 3 políticas de lanzamiento:
any
: la biblioteca decide si se debe generar un hilo de una o noasync
: pedir explícitamente un hilo para ser generadodeferred
: que de forma explícita pida un hilo no engendrado
Por lo tanto, elLa políticaes una forma de obtener evaluación perezosa determinista (también conocida como llamada por necesidad). Por ejemplo, suponga que tiene:
void MyClass::lazy(std::future<int> const& f) {
if (this->notReady()) { return; }
if (this->stillNotReady()) { return; }
if (this->value() == 42) { return; }
this->go(f.get());
}
Ahora bien, si el cálculo del valor de este número entero es largo (por ejemplo, puede invocar un ida y vuelta de red), entonces es un poco derrochador para calcular en todo el casos que realmente no lo requieren ... ¡y ahora tenemos la herramienta para hacerlo!
void func(MyClass& mc) {
std::future<int> f = std::async(std::launch::deferred, []() {
return stoi(memcached.get("KEY"));
});
mc.lazy(f);
}
Tenga en cuenta que esto es sutilmente diferente del uso de un std::function<int()>
(y un cierre), porque el cálculo se realiza una vez por todas, garantizando que las llamadas posteriores para obtener siempre devuelven el mismo resultado.
La diferencia con las otras políticas también se puede expresar en términos de si la operación se realiza cuando no necesita el valor.
any
: podría ser realizado en otro hilo (proactiva) o no se realiza en absolutoasync
: se llevará a cabo en otro hilodeferred
: se no realizarse
Por lo tanto, deferred
le da un mejor control, que es importante si la llamada tiene un efecto secundario.
"sync" es de hecho 'std :: launch :: deferred' – Cubbi
@Cubbi: gracias por señalar, debería haber verificado con el estándar. –
"las llamadas subsiguientes a' get() '" invocarán un comportamiento indefinido, ya que 'get()' invalida el 'futuro'. Necesitarías un 'shared_future' para evitar la invalidación. –
- 1. ¿Cuándo debería usar async/await y cuándo no?
- 2. AJAX sync and async difference
- 3. ¿Cuándo se debería usar std :: nothrow?
- 4. ¿Cuándo debería usar Controladores Async en ASP.NET MVC?
- 5. Mockito con Java async-> sync converter
- 6. Política con std :: captura bad_alloc
- 7. std :: async - std :: launch :: async | std :: launch :: deferred
- 8. Reemplazando std :: async con una versión propia, pero ¿dónde debería std :: promise en vivo?
- 9. ¿Cuándo debería usar _aligned_malloc()?
- 10. Cuándo debería usar SynchronousQueue
- 11. Puede usar std :: async con funciones de plantilla
- 12. ¿Cuándo debería usar GC.SuppressFinalize()?
- 13. ¿Cuándo debería usar CompiledQuery?
- 14. ¿Cuándo debería usar ConcurrentSkipListMap?
- 15. ¿Cuándo debería usar semáforos?
- 16. Grand Central Dispatch async vs sync
- 17. ¿Cuándo debería preocuparme por std :: iostream :: centinela?
- 18. ¿Cuándo debería usar html5 sessionStorage?
- 19. el comportamiento de std :: asíncrono con la política std :: :: lanzamiento asíncrono
- 20. ¿Cuándo debería usar los parámetros?
- 21. ¿Cuándo debería usar Silverlight y cuándo XNA?
- 22. ¿Cuándo debería usar TCP_NODELAY y cuándo TCP_CORK?
- 23. C#: ¿Cuándo debería usar TryParse?
- 24. ¿Cuándo debería usar git add?
- 25. ¿Cuándo debería usar marcos HTML?
- 26. ¿Cuándo debería usar # en ColdFusion?
- 27. ¿Cuándo debería usar un analizador?
- 28. ¿Cuándo debería usar require() y cuándo usar define()?
- 29. ¿Por qué no debería usar async (evented) IO
- 30. C# ¿Cuándo debería usar List y cuándo debería usar el arraylist?
http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html ---> Esto podría ser útil – Jagannath