programacion - Uso de futuros C++ 11: llamadas anidadas de std:: bloqueo asíncrono: ¿Compilador/error de biblioteca estándar?
programacion c++ estructuras (1)
Después de experimentar bloqueos al introducir llamadas anidadas de std :: async en mi programa real, pude reproducir el problema en el siguiente
ejemplo mínimo
.
Se bloquea a menudo, pero no siempre.
¿Ves algo que sale mal o es un compilador o un error de biblioteca estándar?
Tenga en cuenta que el problema persiste si se agregan las llamadas
get()
a los futuros.
#include <future>
#include <vector>
int main (int, char *[])
{
std::vector<std::future<void>> v;
v.reserve(100);
for (int i = 0; i != 100; ++i)
{
v.emplace_back(std::async(std::launch::async, [] () {
std::async(std::launch::async, [] { });
}));
}
return 0;
}
Observo dos tipos diferentes de accidentes: (en aproximadamente cada quinta carrera)
- Finalización con "Esta aplicación ha solicitado al Runtime que la finalice de una forma inusual".
- Terminación después de lanzar una instancia de ''std :: future_error'', what (): Promise ya satisfecho .
Ambiente:
- Windows 7
- gcc versión 4.8.2 (i686-posix-dwarf-rev3, construido por el proyecto MinGW-W64), según lo dispuesto por Qt 5.3.2
-
Llamada de línea de comando:
g++ -std=c++11 -pthread futures.cpp
- Compilado y ejecutado en dos máquinas independientes.
Opción
-pthread
?
¿Podría ser que en mi entorno por alguna razón la opción
-pthread
no se tenga en cuenta silenciosamente?
Observo el mismo comportamiento con y sin esa opción.
Dado que esta respuesta todavía "no tiene respuesta", después de hablar con algunas personas de
Lounge<C++>
, creo que puedo decir que es bastante obvio por los comentarios que
esto se debe a un error de implementación por parte de MinGW / MinGW-w64 o pthread en el momento.
Usando gcc 4.9.1, MinGW-W64, el problema ya no aparece.
De hecho, el programa anterior parece compilarse y ejecutarse correctamente incluso en una versión
anterior
a 4.8.2 con subprocesos POSIX.
Yo mismo no soy un experto, supongo que el error exacto ocurre cuando el programa parece intentar escribir la misma promesa dos veces, lo que, creo, debería ser un gran no-no, como std :: async debería escribir su resultado solo una vez (de nuevo, no estoy seguro si estoy aquí, y es probable que otros comentarios y ediciones aclaren).
Además, este puede ser un problema relacionado: std :: futura excepción en la implementación experimental de gcc de C ++ 0x