Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Recomiendacion entre proceso o hilo

Estas en el tema de Recomiendacion entre proceso o hilo en el foro de C/C++ en Foros del Web. Hola, lo que sucede es que tengo el siguiente problema: Necesito recibir ciertos datos de la red, pero si no los recibo en determinados milisegundos, ...
  #1 (permalink)  
Antiguo 14/09/2013, 12:07
 
Fecha de Ingreso: junio-2005
Ubicación: México, México
Mensajes: 429
Antigüedad: 19 años, 5 meses
Puntos: 1
Recomiendacion entre proceso o hilo

Hola, lo que sucede es que tengo el siguiente problema:

Necesito recibir ciertos datos de la red, pero si no los recibo en determinados milisegundos, entonces dejo de esperarlos. Esto se debe repetir cierto número de veces de las cuales algunas sí recibiré respuesta y otras no.

La situación es que la función que recibe dichos datos se queda esperando hasta que los recibe y si nunca los recibe se queda esperando por siempre.

Se me ocurrió hacerlo creando un proceso que espere los datos y si no los recibe en el tiempo esperado, matar dicho proceso. Pero crear un proceso nuevo siento que es demasiado costoso (sobre todo porque hace la copia de la memoria del proceso padre). Además para su comunicación necesito hacer una tubería, escribir y leer en ella continuamente y en eso podría llevarse mucho tiempo de los pocos milisegundos que tengo para recibir los datos (o eso creo yo).

Después pensé en los hilos, éstos no lo sé utilizar muy bien y lo poco que he leído es que un hilo puede esperar a que otro termine y le devuelva una respuesta, pero para recibir esta respuesta necesito "dormir" al que espera. La cosa es que yo necesito que mi hilo "padre" pueda recibir una respuesta del hilo "hijo" pero sólo determinado tiempo (o sea que no lo puedo dormir), después del cual necesito matar al hilo "hijo" y comenzar de nuevo.

Ustedes qué me recomiendan hay alguna de hacer eso con hilos (o sea, esperar una respuesta pero aún así no dormir a mi hilo "padre") o de plano me voy con procesos?

Gracias de antemano!
  #2 (permalink)  
Antiguo 14/09/2013, 14:07
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Recomiendacion entre proceso o hilo

Hilo sin lugar duda, mucho menos costoso y mucho más fácil de comunicarse (puedes usar hasta variables globales).

Cita:
Después pensé en los hilos, éstos no lo sé utilizar muy bien y lo poco que he leído es que un hilo puede esperar a que otro termine y le devuelva una respuesta, pero para recibir esta respuesta necesito "dormir" al que espera
No tienes porque quedarte esperando a que termine. Y si lo ejecutas detach() se liberaran los recursos solos.

Te dejo aquí un sistema algo burdo de como podrías hacerlo:

Código C:
Ver original
  1. void Hilo(void* param)
  2. {
  3.    bool* Terminado = (bool*) param;
  4.  
  5.    Funcion_Bloqueante();
  6.  
  7.    *param = true;
  8. }
  9.  
  10. void FuncionPadre()
  11. {
  12.    bool Terminado;
  13.    Crear_Hilo(&Terminado); // Crear hilo, incluir el atributo detach en la implementación
  14.    
  15.    while (1)
  16.    {
  17.        // otras cosas
  18.      
  19.       if (Terminado) puts("Hilo terminado");
  20.    }
  21. }

La implementación variará dependiendo de la librería de hilos que uses. Y seguramente tengas que hacer un mecanismo de sincronización para la variable bool.

Si usas C++, te recomiendo la librería de hilos que tiene el estándar C++11.
  #3 (permalink)  
Antiguo 24/09/2013, 20:12
 
Fecha de Ingreso: junio-2005
Ubicación: México, México
Mensajes: 429
Antigüedad: 19 años, 5 meses
Puntos: 1
Respuesta: Recomiendacion entre proceso o hilo

Muchas gracias! Lo intenté con hilos y funcionó, pero con un detalle...

Los hilos se crean correctamente, pero como te comentaba, algunos hilos terminarán (siguiendo tu ejemplo, algunos llegarán a la parte de *param = true;) pero habrá otros que no, y que posiblemente nunca lleguen a esa parte (o sea, se quedarán "por siempre" en la línea de Funcion_Bloqueante();) lo que quisiera saber es cómo "matar" a esos hilos que se quedan en la Funcion_Bloqueante?

El problema es así (siguiendo tu ejemplo):

- Creo un hilo que ejecuta la Funcion_Bloqueante
- Mi hilo principal se encuentra en un ciclo while dando "vueltas" hasta que se cumplen 100ms
- Una vez que se cumplieron los 100ms, reviso la variable boleana "Terminado".
- Si "Terminado" es "verdadero", quiere decir que el hilo terminó correctamente (y quiero pensar que liberó sus recursos de manera correcta)
- Si "Terminado" es "falso", quiere decir que el hilo se sigue ejecutando.

Es en esta última parte donde tengo la confusión, ¿Cómo libero los recursos de ese hilo que se sigue ejecutando? Porque posiblemente se quedará por siempre en la linea de Funcion_Bloquente, o sea, que en código sería:

Código PHP:
    void Hilo(voidparam)
    {
       
boolTerminado = (bool*) param;
     
       
Funcion_Bloqueante();
     
       *
param true;
    }
     
    
void FuncionPadre()
    {
       
bool Terminado;

       for (
0250i++) { //Necesito repetir el proceso muchas veces e ir matando a los hilos que no lleguen a terminarse
            
Crear_Hilo(&Terminado); // Crear hilo, incluir el atributo detach en la implementación
       
            
while (1) {
           
// otras cosas
           //Cuenta hasta 100ml
        
}

         
//Pasaron los 100ms:

         
if (Terminadoputs("Hilo terminado");
            else if (!
Terminadoputs("No termino, aquí debería matarlo para crear uno nuevo en mi próximo ciclo y liberar sus recursos, cómo lo hago?")
       }

    } 
Me di cuenta que había un problema porque mi programa, aunque llega al final, se queda trabado, además, la máquina se empieza a quedar sin recursos, por ejemplo, ya no me deja abrir ningún programa argumentando que ya no hay memoria y me obliga a reiniciar la PC...

Muchas gracias!

Última edición por scrolling; 24/09/2013 a las 20:40

Etiquetas: hilo, proceso
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:41.