Pregunta

Me estaba preguntando si hay una forma elegante para establecer el tiempo máximo de carga de la CPU para un determinado hilo haciendo intensivo de cálculos.

Ahora he encontrado la que más tiempo consume bucle de hilo (no sólo de compresión) y el uso GetTickCount() y Sleep() con los valores codificados.Se asegura de que el bucle continúa durante un cierto período de tiempo y que se duerme durante un cierto tiempo mínimo.Más o menos hace el trabajo, es decir,garantiza que el hilo no se utilice más de 50% de la CPU.
Sin embargo, el comportamiento depende del número de núcleos de CPU (enorme desventaja) y simplemente feo (más pequeña desventaja :)).
Alguna idea?

¿Fue útil?

Solución

Yo no soy consciente de ninguna API para hacer llegar el sistema operativo del programador para hacer lo que quiera (incluso si el hilo está inactivo prioridad, si no hay mayor prioridad listo hilos, el tuyo va a ejecutar).Sin embargo, creo que se puede improvisar una forma bastante elegante limitación de función que se basa en lo que ya lo están haciendo.Esencialmente (no tengo un Windows dev máquina a mano):

Elija una cantidad predeterminada de tiempo el hilo de la suspensión de cada iteración.A continuación, en cada iteración (o en cada n-ésima iteración, de tal manera que la función de limitación de no convertirse en una importante carga de CPU),

  1. Calcular la cantidad de tiempo de CPU tu hilo utilizado desde la última vez que su limitación de la función fue llamada (voy a llamar a este dCPU).Usted puede utilizar el GetThreadTimes() API para obtener la cantidad de tiempo que el hilo se ha de ejecutar.
  2. Calcular la cantidad de tiempo real transcurrido desde la última vez que su limitación de la función fue llamada (voy a llamar a este dClock).
  3. dCPU / dClock es el % de uso de CPU (de una CPU).Si es más alto de lo que usted desea, aumentar su tiempo de sueño, si es menor, la disminución del tiempo de sueño.
  4. Tiene su hilo de sueño para la calculada tiempo.

Dependiendo de cómo su perro guardián calcula el uso de la CPU, puede que desee utilizar GetProcessAffinityMask() para averiguar cuántas Cpu el sistema tiene.dCPU / (dClock * Cpu) es el porcentaje de tiempo total de CPU disponibles.

Usted todavía tiene que recoger algunos de los números de magia para la inicial de la hora de dormir y en el incremento/decremento de la cantidad, pero creo que este algoritmo puede ser sintonizado para mantener un hilo conductor en bastante cerca de un determinado por ciento de la CPU.

Otros consejos

En linux, puede cambiar la prioridad de programación de un hilo con la agradable().

No puedo pensar en cualquier plataforma de la cruz de lo que usted desea (o de cualquier manera garantizada de que se detenga por completo), pero como usted está usando GetTickCount tal vez usted no está interesado en la plataforma de la cruz :)

Yo uso la comunicaciones entre procesos y establecer los procesos intensivos de niza niveles para conseguir lo que necesita, pero no estoy seguro de que es apropiado para su situación.

EDITAR:Estoy de acuerdo con Bernard es por eso que pensar en un proceso más que como un hilo que podría ser más apropiado, pero es posible que no se adapte a sus propósitos.

El problema es que no es normal que se quiera salir de la inactividad de la CPU mientras que usted tiene trabajo que hacer.Normalmente se establece una tarea en segundo plano a la prioridad INACTIVO, y dejar que el sistema operativo de la manija de la programación de todo el tiempo de CPU que no es utilizado por las tareas interactivas.

Esto me suena como si el problema es el proceso de vigilancia.

Si su tarea en segundo plano es dependiente de CPU, a continuación, usted desea que se lleve a todos los no utilizados de tiempo de CPU para su tarea.

Tal vez usted debe buscar en la fijación del programa de vigilancia?

Usted puede ser capaz de cambiar la prioridad de un hilo, pero el cambio de la máxima utilización o bien requieren de votación y hacks para limitar la cantidad de cosas que están ocurriendo, o el uso de herramientas que OS pueden establecer el tiempo máximo de utilización de un proceso.Sin embargo, no veo ninguna circunstancia en la que usted quiere hacer esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top