el hilo no se despertó del sueño

Tengo una aplicación de subprocesos múltiples, pero a veces un subproceso que se supone que debe despertarse después de 10 segundos y hacer algo de trabajo no se despierta del sueño o se muere de hambre.

Solo sucede esporádicamente.

//ACE task svc method
int svc (void)
    {
        while(true)
        {
            ACE_DEBUG((MY_INFO "sleep\n"));
            sleep(10);
            ACE_DEBUG((MY_INFO "awake for HB\n"));
            _csender.sendHeartBeat();
        }

        return 0;
    }

La última línea del registro es: 2012-06-12 11:34:20.807272|INFO|sleep

El subproceso no se despertó durante 15 segundos o no hizo ningún trabajo después de despertarse hasta el segundo 15, por lo que la aplicación se cerró.

Hay un total de 6 subprocesos en la aplicación, todos iniciados con la misma prioridad. Uno de los subprocesos está muy ocupado, recibe una gran cantidad de datos de mercado y los procesa, pero no envía nada al socket. El subproceso anterior es el único subproceso que envía datos y tanto el subproceso receptor como el remitente comparten el mismo objeto de socket.

Esto es en red hat linux 5.3.

¿Alguna idea de cuál podría ser el problema?

preguntado el 12 de junio de 12 a las 17:06

¿Te refieres a 15ms? ¿Su hilo 'muy ocupado' por casualidad está usando mucho ACE_DEBUG()? -

15 segundos en realidad. :), el hilo ocupado imprime 2 ACE_DEBUG cada 2 microsegundos para decirnos qué está pasando con fines de depuración, pero el problema también ocurre sin declaraciones ACE_DEBUG. -

¿Qué aspecto tiene ACE_DEBUG? -

¿Por casualidad estás estableciendo diferentes prioridades para alguno de tus hilos? Si ese no es el caso, sospecharía que el código viene después del sueño en lugar del sueño en sí. Por ejemplo, si inserta un punto de interrupción o una impresión (en un archivo que no utiliza ninguna otra llamada en ninguna parte) en la línea después de la suspensión, ¿alguna vez se activa? -

3 Respuestas

'El subproceso ocupado imprime 2 ACE_DEBUG cada 2 microsegundos', por lo que probablemente obstruya la cola de salida del depurador y evite que este subproceso ingrese para poner en cola su 'reposo\n'.

Eso, y/o ha priorizado este hilo y no puede obtener un núcleo, como han indicado otros carteles.

El sueño (10) es casi irrelevante.

Respondido el 13 de junio de 12 a las 18:06

El sueño no ofrece ninguna garantía sobre el tiempo máximo de sueño, es decir, duermes al menos esa cantidad de tiempo o más tiempo. Sin embargo, no sé si es plausible esperar un retraso de 5 segundos, suena demasiado largo.

Respondido el 12 de junio de 12 a las 17:06

Creo que está en ACE_DEBUG. ¿Probaste un printf con un rubor justo después del sueño?

Respondido el 13 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.