Ir para o conteúdo
ZNez

Dúvida em threads

Mensagens Recomendadas

ZNez    0
ZNez

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bruno1234    20
bruno1234

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
msr    0
msr

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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  :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
forcewill    0
forcewill

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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  ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gooden    0
Gooden

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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  ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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  ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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  ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
zecapistolas    0
zecapistolas

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  :)

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade