Threads matando a CPU

Plataformas baseadas em ARM Cortex A8 ou superior

Moderadores: andre_luis, 51, guest2003, Renie

Threads matando a CPU

Mensagempor denis » 12 Fev 2018 13:30

Pessoal,

Esta aplicação estava consumindo quase 300% da CPU rodando 3 threads numa Raspberry Pi 3.

Código: Selecionar todos
pthread_t         tid[NUM_THREADS];

int main(int argc, char **argv)
{
   (void)pthread_create(&(tid[0]),   NULL,   &CheckPowerAC      ,   NULL);

   while (1)
   {

   }

   return 0;
}

void *CheckPowerAC(void *arg)
{
   static _u64Timeout_t   Timeout = 0;
   
   while (1)
   {
      if (GetCurrTime() >= Timeout)
      {
         /* ... */
      }
   }

   return NULL;
}


Apenas para testar troquei o if por um sleep() assim:

Código: Selecionar todos
   while (1)
   {
      /* ... */
      sleep(10);
   }


O uso da CPU caiu absurdamente.
Eu devo usar sleep() sempre quando uso threads?
Ou seria uma característica da Raspberry / SO ?

abs,
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Threads matando a CPU

Mensagempor Red Neck Guy » 12 Fev 2018 13:46

Com o sleep, o scheduler do SO deixa a tua thread bloqueada por 10 ticks.
Sem o sleep, o scheduler precisa colocá-la pra rodar a cada rodada de escalonamento.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: Threads matando a CPU

Mensagempor denis » 12 Fev 2018 14:33

Aquino escreveu:Com o sleep, o scheduler do SO deixa a tua thread bloqueada por 10 ticks.
Sem o sleep, o scheduler precisa colocá-la pra rodar a cada rodada de escalonamento.


Pensando melhor, acho que é burrice deixar a CPU checando um timer frequentemente sabendo que o sleep resolve isso de forma mais elegante.

Eu só não esperava que um simples if rodando em loop numa thread faria um estrago deste.
Só consegui notar este problema quando a CPU estava nos 80°C.
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Threads matando a CPU

Mensagempor andre_luis » 12 Fev 2018 14:34

Talvez o recurso da Thread não esteja sendo bem aproveitado no contexto de um sistema embarcado. Há mais de 10 anos atrás quando mexi com o BlackFin da Analog Devices, utilizava um recurso do RTOS deles para sair antecipadamente da thread quando a execução da rotina de interesse terminasse. A utilização de um loop "infinito" soa como um desperdício de processamento.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Threads matando a CPU

Mensagempor Vonnilmam » 16 Mar 2018 22:20

Uma pergunta de amador..

Vocês estão utilizando que tipo de compilador "basic" ou "C"?
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Threads matando a CPU

Mensagempor Red Neck Guy » 16 Mar 2018 23:59

Basicamente a conversa é sobre C.
Mas detalhe, o conceito do computação concorrente não tem relação direta com a linguagem utilizada. O conceito de escalonamento de tarefas é um conceito de computação que independe da linguagem. Por exemplo, em sistemas de tempo real a literatura cita o uso de linguagem ADA, ou até mesmo Java com extensões de tempo real.
No .NET você pode criar thread utilizando o BASIC....
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24


Voltar para RaspyBerry, BeagleBone, etc...

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x