1 / 28

Introdução à Threads para Windows na linguagem C

Introdução à Threads para Windows na linguagem C. Modularizando Threads em uma struct C. Luiz Carlos d´Oleron lcadb@cin.ufpe.br. Introdução. Nesta aula aprenderemos: Como usar Threads na Linguagem C;

yorick
Download Presentation

Introdução à Threads para Windows na linguagem C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br

  2. Introdução • Nesta aula aprenderemos: • Como usar Threads na Linguagem C; • Como criar um conjunto de artefatos que ocultem a complexidade do Sistema Operacional para programação multi-thread em C.

  3. Motivação • Gerenciamento de Threads e Processos é algo intrissecamente ligado ao Sistema Operacional • Programas que utilizam técnicas Multi-Thread podem ter código nativo do SO espalhado e misturado com outros tipos de código (negócio, persistência, etc…) • API de SO´s não são muito legíveis

  4. Exemplo • Excemplo1.c

  5. Modularizando o código • Nas linguagens Orientadas a Objetos, tal como Java e C++, existem Classes que encapsulam as responsabilidades do Thread e do Sistema Operacional • Essas Classes permitem Reuso, ao passo que podem ser Estendidas • Em C, as coisas são um pouco mais difíceis, pois não possuímos algumas ferramentas valiosas, como Herança e Polimorfismo!

  6. Classe Thread de Java Dando uma olhada na classe Thread de Java: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html

  7. Modularizando o código • A idéia principal é criar uma struct em C que, junto com algumas funções, se pareça um pouco com a classe Thread de java • Dessa forma, poderemos reutilizar a struct em nossas aplicações, ocultando nela os detalhes do Sistema Operacional • Como?

  8. A struct Thread typedef struct thread{ //um identificador para o Thread char* nome; //a funcao que deverá ser executada pelo Thread EnderecoFuncao* run; //um manipulador para o Thread //Utilizado, por exemplo, para saber se o Thread //ainda está vivo HANDLE handle; } Thread;

  9. Funções para a struct //Construtor do Thread Thread* newThread(char* nome, EnderecoFuncao* funcaoThread); //funcao start inicia a execução do Thread em //paralelo com a execução atual void start(Thread* t, void* parametros);

  10. Funções para a struct //funcao faz o Thread atual dormir por no //mínimo tempoEmMiliSegundos void sleep(int tempoEmMiliSegundos); //Faz a Thread atual aguardar pela conclusão do // Thread t void join(Thread* t); //Faz o Thread atual abdicar pela sua parcela atual // de tempo na CPU void yield();

  11. Ops!!! • Mais na classe Thread de java, run é um método, e não um atributo!

  12. Explicando • Em C, não há Herança. Para solucionar isso, usaremos algo que não é possível ser feito em java • Definimos um Ponteiro para uma Função • Assim nossa Thread em C poderá ser extensível, mesmo sem herança

  13. Usando a struct Thread void funcaoSoma (void* param){ int i = 0; char* nome = (char*) param; for(i = 0;i<10;i++){ printf("%s : %d \n",nome,i); yield(); } } void funcaoSub (void* param){ int i = 0; char* nome = (char*) param; for(i = 9;i>=0;i--){ printf("%s : %d \n",nome,i); yield(); } }

  14. Usando a struct Thread int main(int argc, char *argv[]) { Thread* t1 = newThread(“ThreadSoma", funcaoSoma ); Thread* t2 = newThread(“ThreadSub", funcaoSub ); start(t1, t1->nome); start(t2, t2->nome); join(t1);//Aguarda t1 join(t2);//Aguarda t2 system("PAUSE"); }

  15. Exemplo com struct Thread • O mesmo exemplo do slide 4 pode ser encontrado no Exemplo2.c, dessa vez, usando a struct Thread

  16. A implementação • A implementação das funções de Thread.h podem ser encontradas na classe Thread.c • Lá estão isolados os detalhes do acesso ao Sistema Operacional

  17. A implementação • Foram utilizadas as seguintes funções da API do Windows: • CreateThread • GetExitCodeThread • Sleep

  18. A função CreateThread • Cria uma Thread para executar em paralelo no processo que a chamou; • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId );

  19. A função CreateThread • Exemplo de chamada de CreateThread: void funcao(void* p){...} ... char* parametros = “teste”; HANDLE handle = CreateThread(NULL,0, funcao, parametros,0,NULL);

  20. A função CreateThread • Para simplificar, daremos ênfase apenas aos parâmetros: • lpStartAddress – a função que será executada pelo Thread • lpParameter – Parâmetro que será passado para a função do Thread

  21. A função GetExitCodeThread • Retorna o código de saída da Thread, usada para descobrir se o Thread já acabou de executar sua função; • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getexitcodethread.asp BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode );

  22. A função GetExitCodeThread • Exemplo de uso de GetExitCodeThread: HANDLE handle = …; LPDWORD exitCode; GetExitCodeThread(handle,&exitCode); if(exitCode==STILL_ACTIVE){ printf(“Thread ainda Funcionando”); }else{ printf(“Thread Morto”); }

  23. A função GetExitCodeThread • hThread– O “manipulador” da Thread. Componente que permite obter informações do ciclo de vida da Thread • lpExitCode– Parâmetro que contém o código de saída do Thread. Se o Thread ainda estiver executando, lpExitCode será igual a STILL_ACTIVE

  24. A função Sleep • Similar ao método estático sleep da classe Java, a função Sleep fará a Thread atual adormecer por, no mínimo, o tempo especificado; • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp VOID Sleep( DWORD dwMilliseconds );

  25. A função Sleep • Passar o valor zero para Sleep faz com que o Thread atual abdique de seu tempo na CPU, deixando para o SO decidir por um novo Thread a executar. Se nenhum outro Thread estiver disponível, a função retorna automaticamente, fazendo com que o Thread inicial volte à exeução; • Usamos Sleep(0) para simular a função void yield().

  26. A função Sleep • Exemplo de uso de Sleep int tempo = 10000; printf(“Fazendo o programa parar por no mínimo %d milisegundos\n”, tempo); Sleep(tempo); printf(“O programa parou por no mínimo %d milisegundos\n”, tempo);

  27. Resumo • Código que usar Thread em C irá depender do Sistema Operacional • Podemos usar structs e funções para modularizar e abstrair o código dependente do Sistema Operacional • Assim o restante do código ficará mais limpo e flexível

  28. Mais informações • Muita coisa sobre Threads não foram vistas nessa aula • O exemplo apresentado poderá ser estendido, por exemplo, para contemplar sincronização e prioridades • Procure mais informações nas fontes: • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/multiple_threads.asp • http://www.cin.ufpe.br/~adsl/cursos

More Related