Aplicación C simple con 50% de CPU.

Tengo una aplicación C simple que usa el 50% constante. No sé por qué, pero me gusta minimizarlo tanto como sea posible.

#include  #include  #include  void Wait(int seconds) { clock_t endwait; endwait = clock () + seconds * CLK_TCK ; while (clock() < endwait) {} } void main() { printf ("program running.\n"); /* Wait( 4 ); */ printf( "Done Waiting!\n" ); printwow(); /* exit(0); */ } timer_func (void) { Wait( 4 ); printwow(); } printwow() { printf ("Say hello"); timer_func(); } 

Supongo que debe ser el temporizador por supuesto. Pero no lo sé con seguridad.

Gracias.

Use alguna función de suspensión incorporada, que no usa los ciclos del procesador para “esperar”, como la sleep desde unistd.h .

Su bucle:

 while (clock() < endwait) {} 

está ocupado esperando . Básicamente estás teniendo la siguiente conversación con la CPU.

"¿Ya llegamos?" "No."

"¿Ya llegamos?" "No."

"¿Ya llegamos?" "No."

(Repetir varias veces gazillion)

"¿Ya llegamos?" "Sí."

Es mejor que utilice una función como sleep() que le dice a la CPU que le avise cuando esté lista.

Sí, es tu ciclo cerrado en Wait() . Probablemente tenga una máquina de doble núcleo, por lo que está utilizando el 100% de un núcleo. Use sleep() lugar.

timer_func() y printwow() llaman para siempre. Eventualmente obtendrás un desbordamiento de stack.

porque el bucle

 while (clock() < endwait) {} 

cpu tiene que verificar el valor de clock () todo el tiempo, use sleep () en lugar de su propio código.

Si desea que su código se duerma durante 4 segundos, puede usar el modo de suspensión (4) para hacer eso y es casi seguro que no consumirá la CPU como lo hace la función de espera (). Tenga en cuenta que el modo de suspensión (4) bloqueará la ejecución del rest de su progtwig de un solo hilo y, si no desea eso, necesitará algo más sofisticado, pero sospecho que el sueño (4) será suficiente aquí.

Además, su código finalmente agotará la stack porque printwow () llama a timer_func () que llama a printwow () que llama a timer_func () etc. etc. hasta el infinito en un ciclo recursivo. Necesita arreglar esto, probablemente utilizando un bucle for / while en lugar de recursión.