[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: dormindo threads



Olá,

Sei que não eh necessario mas brinquei um pouco com o codigo do Danilo
para saber como se comportava o sleep quando chamado por uma thread nao
dormente enquanto outra dorme. Ele se comporta perfeitamente. Um exemplo
foi: fiz duas threads pedirem sleep ao mesmo tempo, só que uma pede
sleep de dois segundos e a outra de quatro, e dá tudo certo, ou seja,
uma acorda dois segundos depois e a outra dois segundos depois da
primeira acordar.

Segue anexo codigo fonte.

Fabio

Danilo Matheus Rubio Conde wrote:
> 
> Ola,
> 
>         Estive fazendo alguns testes aqui com as funcoes sleep(secs) e
> usleep(usecs) e cheguei a resultados que me levam a conclusoes
> estranhas, levando em consideracao que jah foi dito nesta lista que a
> funcao sleep() trava todos os threads.
>         Meu teste: fiz um programinha bobo que cria dois threads. Um deles
> chama a funcao sleep() (ou usleep(), deu na mesma) e o outro fica
> imprimindo numeros feito louco, mesmo quando o outro thread estah
> esperando. O segundo thread soh para quando o primeiro muda o valor de
> uma variavel, apos esperar um tempo.
>         Minha conclusao: como o segundo thread fica imprimindo numeros sem
> parar, mesmo enquanto o outro estah esperando, as funcoes sleep() e
> usleep() fazem apenas o thread que a chamou esperar. Certo ?
>         O codigo fonte estah abaixo.
> 
>         Professor, estou certo ?
> 
> Danilo, confuso.
>
#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <unistd.h>


int vai;

void *
bla ()
{
  struct timeval teste0, teste1;
  printf ("antes 1\n");
  fflush (stdout);
  sleep (2);
  vai = 1;
  printf ("depois 1\n");
  fflush (stdout);
  gettimeofday (&teste0, NULL);
  sleep (4);
  gettimeofday (&teste1, NULL);
  printf ("O bla pediu um sleep de 4 e dormiu por %1.0f segundos.\n",
	  difftime (teste1.tv_sec, teste0.tv_sec));
  fflush (stdout);
}

void *
ble ()
{
  struct timeval teste0, teste1;
  int z = 0;
  printf ("antes 2\n");
  fflush (stdout);
  while (!vai)
    {
      printf ("%d\n", z++);
      sleep (1);
    }
  printf ("depois 2\n");
  fflush (stdout);
  gettimeofday (&teste0, NULL);
  sleep (2);
  gettimeofday (&teste1, NULL);
  printf ("O ble pediu um sleep de 2 e dormiu por %1.0f segundos.\n",
	  difftime (teste1.tv_sec, teste0.tv_sec));
  fflush (stdout);
}



int
main ()
{

  pthread_t t1, t2;
  pthread_attr_t attr;

  pthread_attr_init (&attr);
  pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);

  vai = 0;

  pthread_create (&t1, &attr, bla, NULL);
  pthread_create (&t2, &attr, ble, NULL);
  pthread_join (t1, NULL);
  pthread_join (t2, NULL);

  return 1;
}