[C con Clase] Problema de uso de CPU

pogui poguijuaz en gmail.com
Mar Mar 9 22:26:55 CET 2010


Hola David, gracias por responder,
Desconosco a lo que te referís. Me das alguna pista?
Estoy bajo gnu/linux.
Al parecer que la llamada no sea bloqueante es la solución ya que si 
incluyo por ejemplo un retraso con un sleep que no consume instrucciones 
del procesador, el consumo baja considerablemente.

gracias por tu tiempo.

David Fire escribió:
> hola
> en vez de utilizar una lista utiliza una cola del sistema operativo, 
> la llamda es bloqueante, osea en vez de estar perdiendo tiempo y 
> consumiendo cpu mirando si hay datos, se va a quedar durmiendo 
> esperando los datos.
>
>
>
> El 9 de marzo de 2010 12:15, pogui <poguijuaz en gmail.com 
> <mailto:poguijuaz en gmail.com>> escribió:
>
>     Hola lista, tengo el siguiente problema:
>     Tengo una porción de memoria dinamica (una simple cola) compartida
>     entre cierta cantidad de threads, unos threads que atienden
>     conecciones tcp/ip agregan datos a dicha estructura dinamica, y
>     otro thread es el encargado de sacar datos y procesarlos.
>     Ahora el problema es el siguiente, el thread encargado de sacar
>     los datos de la estructura dinamica y procesarlos, dispara mi cpu
>     al %100 ya que está en un bucle infinito checkeando que si hay
>     datos nuevos a procesar segun el siguiente codigo:
>
>     #include <stdio.h>
>     #include <stdlib.h>
>     #include <pthread.h>
>
>     #include "sistemStack.h"
>     #include "tsmsp.h"
>
>     SMSpNodo primero,ultimo; /* el stack de datos a procesar de ambito
>     global*/
>     pthread_mutex_t outBoxMutex; /*Mutex para proteger dicha memoria
>     dinamica*/
>
>     void* outBox(void* connfd) /*Thread encargado de sacar datos y
>     procesarlos*/
>     {
>       int done=1;
>       struct smsData* smsToSend;
>       printf("Thread del outBox lanzado...\n\n");
>         while(done)  /* el bucle que consume %100 de CPU en cuestión*/
>       {
>           pthread_mutex_lock(&outBoxMutex);
>           smsToSend=smsGet(&primero, &ultimo); /*Tratamos de sacar un
>     dato de la cola  (estructura con datos  o un "0" si no hay datos q
>     procesar)*/
>           pthread_mutex_unlock(&outBoxMutex);
>           if(smsToSend != 0) /* se encontró algun dato para procesar*/
>           {
>               printf("outBox: se detectó mensaje a enviar\n");
>               sendSMS(smsToSend);   /* Procesamos el dato*/
>           }
>       }
>
>       pthread_exit(NULL);
>     }
>
>
>     El codigo funciona bien, pero no esta bien que utilice tanto cpu,
>     si comento el while todo regresa a la normalidad, pero dejo de
>     procesar los datos.
>     Hay alguna manera menos perjudicial de hacer esto?
>     En que me estoy equivocando?
>
>     Espero haber explicado bien el problema,
>     Gracias por su tiempo.
>
>     _______________________________________________
>     Lista de correo Cconclase Cconclase en listas.conclase.net
>     <mailto:Cconclase en listas.conclase.net>
>     http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>     Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>     <http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>
>
>
>
> -- 
> (\__/)
> (='.'=)This is Bunny. Copy and paste bunny into your
> (")_(")signature to help him gain world domination.
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ





Más información sobre la lista de distribución Cconclase