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

[SOLUCIONADO] Como reducir uso de cpu en buble infinito

Estas en el tema de Como reducir uso de cpu en buble infinito en el foro de C/C++ en Foros del Web. Pues como dice el titulo, luego de bastante tiempo en c++, me he dado cuenta de algo bastante problematico... Cada vez que creo un thread, ...
  #1 (permalink)  
Antiguo 11/08/2013, 13:26
 
Fecha de Ingreso: julio-2010
Mensajes: 34
Antigüedad: 14 años, 4 meses
Puntos: 0
Como reducir uso de cpu en buble infinito

Pues como dice el titulo, luego de bastante tiempo en c++, me he dado cuenta de algo bastante problematico...

Cada vez que creo un thread, o una funcion, que tiene un bucle infinito que sale con un break, o cuando se cumple una condicion, pero que no tiene Sleep entre bucle y bucle, la cpu se dispara. Por ejemplo:

bool exit = false;

void thread()
{

while(exit != 1)
{
// funciones
}

}

Sabeis algun metodo para reducir la cpu?? aparte de sleep, quiero que siempre este en alerta el thread, porque algunos procesos son de microsegundos ya no milisegundos. por lo tanto necesito exactitud...

Gracias de antemano.
  #2 (permalink)  
Antiguo 11/08/2013, 15:12
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: Como reducir uso de cpu en buble infinito

Vamos a ver, si no le dejas a la CPU descansar la vas a estresar sí o sí.

Puedes usar condiction_variables, de modo que el hilo permanece dormido hasta que le llega alguna señal (después haces que el proceso le envíe la señal cuando termine).
  #3 (permalink)  
Antiguo 11/08/2013, 15:17
 
Fecha de Ingreso: julio-2010
Mensajes: 34
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Como reducir uso de cpu en buble infinito

Pero, ¿como compruebo que la variable a cambiado?, y envió la señal, necesito un buble infinito hasta que la variable cambia y así reactivar el hilo, estoy en las mismas.
  #4 (permalink)  
Antiguo 11/08/2013, 15:29
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: Como reducir uso de cpu en buble infinito

Cita:
Iniciado por shiro51 Ver Mensaje
Pero, ¿como compruebo que la variable a cambiado?, y envió la señal, necesito un buble infinito hasta que la variable cambia y así reactivar el hilo, estoy en las mismas.
Las variables no, me refiero a las variables de condicion (condiction variables). Fueron creadas precisamente para evitar este problema.

El hilo se queda bloqueado en una pausa infinita, y no despierta hasta que otro hilo "le avise". Su consumo de CPU es cero.

¿Que usas para los threads? ¿Pthread? ¿C++11? ¿Windows API?
  #5 (permalink)  
Antiguo 11/08/2013, 15:32
 
Fecha de Ingreso: julio-2010
Mensajes: 34
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Como reducir uso de cpu en buble infinito

c++ y windows api.
¿Variables de condicion?, no me suenan o.0 voy a buscar, pero si puedes por favor dejame un enlace donde las explique y como se usan.

O un ejemplo de lo que dices de pausa infinita hasta que le avisen. Pero el otro hilo que le avisa tambien tendria que tener un while no?.
  #6 (permalink)  
Antiguo 11/08/2013, 15:39
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: Como reducir uso de cpu en buble infinito

Cita:
Iniciado por shiro51 Ver Mensaje
c++ y windows api.
¿Variables de condicion?, no me suenan o.0 voy a buscar, pero si puedes por favor dejame un enlace donde las explique y como se usan.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Yo te recomendaría que te pasases al nuevo estándar de C++11. Incluye una clase thread muy potente.

Cita:
Iniciado por shiro51 Ver Mensaje
O un ejemplo de lo que dices de pausa infinita hasta que le avisen. Pero el otro hilo que le avisa tambien tendria que tener un while no?.
El otro hilo hará sus cosas, cuando una de ellas te interese, mandas la señal.
  #7 (permalink)  
Antiguo 11/08/2013, 20:14
 
Fecha de Ingreso: julio-2010
Mensajes: 34
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Como reducir uso de cpu en buble infinito

Ya me he mirado bastante y he probado el codigo y luego de romperme la cabeza ya que a microsoft le gusta poner codigo complicado sin saber una mierda... lo reduje a:

Cita:
#include <windows.h>
#include <stdio.h>

CRITICAL_SECTION BufferLock;
CONDITION_VARIABLE vThreadProc;

DWORD WINAPI ThreadProc (PVOID p)
{

while (true)
{
EnterCriticalSection (&BufferLock);

SleepConditionVariableCS (&vThreadProc, &BufferLock, INFINITE);
printf("Hola");

LeaveCriticalSection (&BufferLock);

Sleep (1);
}

return 0;
}

int main ( void )
{
InitializeConditionVariable (&vThreadProc);

InitializeCriticalSection (&BufferLock);

DWORD id;
HANDLE hThreadProc = CreateThread (NULL, 0, ThreadProc, (PVOID)1, 0, &id);

getchar();
WakeConditionVariable(&vThreadProc);
getchar();

return 0;
}
Por lo que veo y como me dijiste, ahorra tiempo de ejecucion y de bucles, unicamente se duerme esperando a que la variable cambie y entonces se reactiva.

Pero aun así, tiene que haber alguien que le avise y ese gastara mucha ejecución si es infinito... En algunos programas servirá... pero en otros no..

Gracias por la ayuda :)
  #8 (permalink)  
Antiguo 12/08/2013, 13:59
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: Como reducir uso de cpu en buble infinito

Claro que alguien tiene que avisar, pero la idea esque lo haga el mismo thread que quieres monotorizar.
  #9 (permalink)  
Antiguo 12/08/2013, 19:46
 
Fecha de Ingreso: julio-2010
Mensajes: 34
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Como reducir uso de cpu en buble infinito

¿Como que el mismo?... que lo haga por ejemplo main, y despierte el thread?... Como va a autodespertarse estando dormido? o.0
  #10 (permalink)  
Antiguo 13/08/2013, 04:22
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: Como reducir uso de cpu en buble infinito

Cita:
Iniciado por shiro51 Ver Mensaje
¿Como que el mismo?... que lo haga por ejemplo main, y despierte el thread?... Como va a autodespertarse estando dormido? o.0
No no... Tu sigues el programa tal cual, y cuando llegue el momento que lo despierte el otro thread/main...

Etiquetas: cpu, funcion, infinito, reducir
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 01:02.