Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

199
Vistas
Terminar función con tiempo de espera

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.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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...

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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 .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda