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

ZNez

Dúvida em threads

Recommended Posts

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

Share this post


Link to post
Share on other sites
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.


Desaparecido.

Share this post


Link to post
Share on other sites
zecapistolas

Ressuscitando o tópico....  :cheesygrin:

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

Share this post


Link to post
Share on other sites
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:

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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  :)

Share this post


Link to post
Share on other sites
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....  🤔 Era tipo dividir trabalho para conquistar mais rápido o objectivo....

cumps  :P

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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  ;)

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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  ;)

Share this post


Link to post
Share on other sites
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  ;)

Share this post


Link to post
Share on other sites
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  ;)

Share this post


Link to post
Share on other sites
zecapistolas

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

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

Share this post


Link to post
Share on other sites
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?!  🤔

cumps  :P

Share this post


Link to post
Share on other sites
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?


Desaparecido.

Share this post


Link to post
Share on other sites
zecapistolas

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

cumps  :thumbsup:

Share this post


Link to post
Share on other sites
zecapistolas

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.