He escrito una biblioteca C++ que realiza un trabajo de CPU muy pesado (todo cálculos matemáticos y cálculos) y si se deja en sus propios dispositivos, consumirá fácilmente el 100% de todos los recursos de CPU disponibles (también es multiproceso al número de núcleos lógicos disponibles en la máquina).¿La mejor manera de ralentizar un hilo? Está utilizando el modo de suspensión() ¿OK?
Como tal, tengo una llamada de retorno dentro del bucle principal de cálculo que el software usando la biblioteca se supone que llamar:
while(true)
{
//do math here
callback(percent_complete);
}
En la devolución de llamada, el cliente llama sueño (x) para reducir la velocidad del hilo.
Originalmente, el código del cliente era una llamada fija de Suspensión (100), pero esto conducía a un mal rendimiento no confiable porque algunas máquinas terminan las operaciones matemáticas más rápido que otras, pero la suspensión es la misma en todas las máquinas. Entonces ahora el cliente verifica la hora del sistema, y si ha pasado más de 1 segundo (lo cual == varias iteraciones), dormirá durante medio segundo.
¿Es esta una forma aceptable de ralentizar un hilo? ¿Debo usar un semáforo/mutex en lugar de Sleep() para maximizar el rendimiento? ¿Está bien dormir x milisegundos por cada 1 segundo de procesamiento o hay algo mal que no estoy notando?
La razón por la que pregunto es que la máquina aún se empantana a pesar de que el técnico de tareas muestra que el proceso ocupa ~ 10% de la CPU. Ya he explorado el disco duro y la contención de la memoria en vano, así que ahora me pregunto si la forma en que estoy ralentizando el hilo está causando este problema.
Gracias!
En Linux, si ejecuta su proceso con un nivel agradable superior, el sistema operativo mantendrá bajo el reloj de la CPU, suponiendo que su hardware admita la escala de velocidad de la CPU. Esto mantendrá la potencia, el calor y el ruido bajos sin estrangulamiento artificial. – karunski
Dulce. Cambiar a Linux por completo es una opción que considero constantemente y hasta el momento siempre rechazo ... –