Tengo una biblioteca de terceros. Esta biblioteca tiene una función llamada int foo() . La función está basada en subprocesos y no puedo cambiar el contenido de la función. (No me pertenece.)
Cuando llamo a la función, se bloquea y no devuelve el valor. ¿Hay alguna forma de eliminar esta función basada en subprocesos cuando la función está bloqueada? Por ejemplo, cuando la función no devuelve el valor en 5 segundos, quiero eliminarla sin pérdida de memoria.
Dado que es una biblioteca de terceros sobre la que no tiene control, no puede terminar de forma portátil el subproceso que ejecuta ese código, aunque puede llamar a native_handle y usar sus funciones de terminación de subprocesos, lo más probable es que presente fugas .
Tenga en cuenta que los subprocesos viven en el mismo espacio de direcciones, por lo tanto, una corrupción o una fuga de un subproceso afecta a todo su programa.
La opción que se me ocurre es generar un nuevo proceso para ejecutar ese código, si después de 5 segundos no se completa, puede solicitar al sistema operativo que lo elimine. {No hay fugas de memoria y se liberan recursos} :-) ...su mejor opción...
Una posible solución, como sugiere StoryTeller , es llamar a foo() en un subproceso diferente, que usted controla. Cuando ocurre el tiempo de espera, deja el subproceso ejecutándose en segundo plano. Esto significa que foo() continúa la ejecución, pero su programa puede continuar. Este método es portátil, por lo que no necesita escribir ningún código dependiente del sistema operativo.
Dejar foo() ejecutándose puede tener efectos secundarios no deseados, y foo() continuará utilizando recursos en segundo plano, por lo que debe probar si esto funciona en su situación.
#include <boost/thread.hpp> #include <ctime> void FooWrapper(bool& hasResult, int& result){ result = foo(); hasResult = true; } void AnotherFunction(){ bool hasResult = false; int result; boost::thread(&FooWrapper, boost::ref(hasResult), boost::ref(result)); // Wait until result, or until timeout std::time_t startTime = time(0); while(!hasResult && time(0) < startTime + 5){ // Do nothing } if(!hasResult){ throw "timeout"; } else{ // Use result } }Estoy usando boost thread aquí, pero puede convertirlo para usar cualquier biblioteca de hilos que desee.
No, no hay forma de hacerlo sin fugas de memoria, porque el subproceso que ejecuta foo puede asignar datos del montón, puede colocar algunos datos privados dentro de los valores que pertenecen a su programa principal o algún otro encabezado.
Tenga en cuenta que la vitalidad de los datos (y el espacio de direcciones virtuales ) es una propiedad de todo el programa: algunos datos del montón no pertenecen a un subproceso (particular), sino a todo el proceso. La biblioteca podría (y probablemente debería) usar punteros inteligentes como una convención .