• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ZNez

Dúvida em threads

27 mensagens neste tópico

Boas...

Estou aqui a fazer um programa no qual me é pedido que escreva num buffer uma mensagem, mas tenho de ter atenção à prioridade que a thread tem. Segundo o enuncioado, a thread com id 0 terá uma prioridade muito maior do que uma com o id 5, por exemplo... já estive para aqui a pensar mais estou sem ideias... alguém sabe como posso resolver isto?

Desde já obrigado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito vago.

Provavelmente o escalonador de tarefas é que tratará do problema. Muito simplesmente, se uma thread tem prioridade superior a outra, terá acesso ao CPU antes dessa outra thread, e automaticamente irá escrever no buffer antes da thread com prioridade menor.

Sem saber mais pormenores da implementação do mecanismo de threads é difícil ajudar mais que isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é o mecanismo de threads que estás a usar, como é que as estás a criar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ressuscitando o tópico....  :biggrin:

Tenho um programa que me procura qualquer ficheiro no PC (uma implementação do "locate") em C. Apesar de estar a funcionar, ele demora substancialmente algum tempo a executar.... Com a criação de thread's, conseguiria-o colocar mais rápido?!

cumps  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se puseres as threads a pesquisar em paralelo em locais diferentes do disco é possivel q seja mais rápido, especialmente em computadores com 2 ou + processadores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se puseres as threads a pesquisar em paralelo em locais diferentes do disco é possivel q seja mais rápido, especialmente em computadores com 2 ou + processadores.

E isso é complicado?!  :-[ Preciso de referências e exemplos....

cumps  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E isso é complicado?!  :-[ Preciso de referências e exemplos....

cumps  :thumbsup:

Nunca trabalhaste com threads?

Se a resposta for negativa e estiveres a trabalhar no linux vê estes links, são muito bons.

Processos: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

Threads e mutexes: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

Não é complicado de implementar, mas precisas de perceber bem em que é que consistem as threads, processos, etc e depois entao ver as funções que estas bibliotecas te disponibilizam.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nunca trabalhaste com threads?

Se a resposta for negativa e estiveres a trabalhar no linux vê estes links, são muito bons.

Processos: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

Threads e mutexes: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

Não é complicado de implementar, mas precisas de perceber bem em que é que consistem as threads, processos, etc e depois entao ver as funções que estas bibliotecas te disponibilizam.

Não, nunca trabalhei com thread's, mas sim estou a programar em Linux....

Vou consultar esses link's....  :P

cumps  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A minha ideia é a seguinte, começar a percorrer na "root" /, e sempre que aparece-se uma nova posta para analisar, criar uma nova thread e essa thread ia analisar o conteúdo desta pasta, enquanto o "pai" dessa thread continuava o seu trabalho e assim sucessivamente....

Neste momento a minha função já funciona, mas apenas só um processo está a executar o trabalho todo e eu queria vários processos/thread's a realizar também esse trabalho....  :hmm: Era tipo dividir trabalho para conquistar mais rápido o objectivo....

cumps  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei até que ponto adianta usar threads, visto que a lentidão deve vir dos acessos ao disco, coisa que não resolves com threads.

E aos criares uma nova thread sempre que aparecesse uma pasta, irias ficar com uma quantidade de threads tão grande que provavelmente iriam atrasar o processo. Duas ou três threads talvez tragam alguma vantagem, mas do que isso não me parece.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei até que ponto adianta usar threads, visto que a lentidão deve vir dos acessos ao disco, coisa que não resolves com threads.

E aos criares uma nova thread sempre que aparecesse uma pasta, irias ficar com uma quantidade de threads tão grande que provavelmente iriam atrasar o processo. Duas ou três threads talvez tragam alguma vantagem, mas do que isso não me parece.

Sim mas de qualquer forma pode vir a retirar algum rendimento visto que os comandos de acesso ao disco, geralmente vão parar a um buffer e optimizados depois.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, invés de criar milhões de thread's, decidi criar apenas para as pastas que estão no root "/", que são neste computador 20 pastas, ou seja, tenho neste momento 20 threads a analisarem o disco rígido inteiro, cada uma começando numa pasta diferente....

Tempos de execução:

* Sem thread's e a procurar ficheiros que na sua path tenham a palavra "who"-> 5min43sec, 159 resultados;

* Com thread's e a procurar ficheiros que na sua path tenham a palavra "who"-> 2min20sec, 159 resultados.

Já está melhor, mas muito longe do desejado....  :D

cumps  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Programas como o locate constroem BDs com todos os ficheiros do disco de modo a que quando fazes uma pesquisa, esta seja feita sobre a BD, e não sobre o disco.

Já agora, podias disponibilizar o código da aplicação?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não sei se aquilo que vou dizer é ridículo mas aqui vai.... para cada pasta cria uma thread... essa thread cria uma thread para cada sub pasta... tipo por camadas. :S ok e estúpido eu sei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não sei se aquilo que vou dizer é ridículo mas aqui vai.... para cada pasta cria uma thread... essa thread cria uma thread para cada sub pasta... tipo por camadas. :S ok e estúpido eu sei.

Só estou a criar thread's para as pastas que estão em "/", não para as subpastas.... Porque, como foi dito aqui, muitas thread's não iria compensar....

cumps  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Será que não compensaria zecaPistoleiro? .... podias testar

O que eu estive a pensar é que se calhar compensava era criar thread's para os dois níveis de pastas do sistema.... Para as que estão na root "/" e nas imediatamente abaixo....

Mais do que isso acho que não compensa, porque depois vai haver pastas com apenas um ficheiro ou até sem nenhum e criei uma thread para testar essa pasta.... Ou seja, foi um pouco inútil porque essa pasta deu pouco trabalho a processar....

cumps  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou então tentar manter um numero fixo de threads em qualquer momento

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou testar essas opções no fim de semana....

EDIT: Para testar isto mesmo a sério, queria o programa no final da execução imprimesse na consola, quanto tempo demorou a executar e também quanta memória foi necessária, isso é possível?!

EDIT2: Para ver o tempo de execução do programa é só escrever na consola "time <nome_do_programa>".... Para ver os recursos utilizados pelo programa é que ainda não sei....

cumps  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os pc's na faculdade devem estar todos cheios de lixo.... Ou é por muito gente ir lá fazer login, ou pastas da rede....  :thumbdown:

Porque tive agora a fazer testes no meu portátil e o resultado do programa é instantâneo....  ;)

Procurar tudo que contenha na sua path "who", começando na raiz do disco:

Com thread's(média) -> 1856mili

Sem thread's(média) -> 2021mili

Quase que nem compensa a utilização de thread's aqui no meu pc.... cumps  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimentei correr agora o programa e num PC, Core 2 Quad, com Ubuntu e 975636 ficheiros no disco....

Com thread's, 132540 milisegundos

Sem thread's, 148268 milisegundos

Obtive um ganho de 15.73 segundos, não era suposto ter um ganho mais significativo?!  :hmm:

cumps  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como o Rui Carlos disse na 1ª página, como estás a trabalhar directamente com leituras do disco, e sendo o disco um dos componentes que mais contribui para as demoras na execução de programas, não será de esperar grandes melhorias com o uso de threads.

Fiquei surpreendido com os valores que obtiveste quando experimentaste as threads da 1ª vez. Fizeste vários testes seguidos ou testaste só uma vez?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os meus últimos dois post's foram baseados na média de 5 execuções do programa....

cumps  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dando seguimento ao meu Programa, agora surgiu-me uma dúvida....  :hmm:

Vamos supor o seguinte exemplo:

void *imprimeNumeros(void *v) {
    int n = (int) v;
    while (1) {
        printf("%d\n", n);
    }
    return NULL;
}

int main() {
    int n = 5;
    pthread_t th[1];
    pthread_create( &th[0], NULL, imprimeNumeros, (void *) n );
    pthread_join( th[0], NULL );

    n++;
    printf("%d\n", n);

    return 0;
}

Só que este "programa" exemplo não executa o "n++" nem o seguinte "printf" .... Só executava estas duas linhas se essas duas linhas estivessem também numa thread.... Podia ter feito com fork's mas depois antes de terminar o Programa tenho que matar esses mesmo fork's, porque esses estariam também em ciclo em finito, etc....

Alguma ideia?!  :)

cumps  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora