[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: dormindo threads
- Subject: Re: dormindo threads
- From: Fabio Silva Dias <fdias@ime.usp.br>
- Date: Fri, 10 May 2002 17:23:53 -0300
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;
}