Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

205
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda