introdução à threads para windows na linguagem c modularizando threads em uma struct c luiz...
TRANSCRIPT
![Page 1: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/1.jpg)
Introdução à Threads para Windows na linguagem C
Modularizando Threads
em uma struct C
Luiz Carlos d´Oleron
![Page 2: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/2.jpg)
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.
![Page 3: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/3.jpg)
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
![Page 4: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/4.jpg)
Exemplo
• Excemplo1.c
![Page 5: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/5.jpg)
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!
![Page 6: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/6.jpg)
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
![Page 7: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/7.jpg)
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?
![Page 8: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/8.jpg)
A struct Threadtypedef 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;
![Page 9: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/9.jpg)
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);
![Page 10: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/10.jpg)
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();
![Page 11: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/11.jpg)
Ops!!!
• Mais na classe Thread de java, run é
um método, e não um atributo!
![Page 12: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/12.jpg)
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
![Page 13: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/13.jpg)
Usando a struct Threadvoid 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();
}
}
![Page 14: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/14.jpg)
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");
}
![Page 15: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/15.jpg)
Exemplo com struct Thread
• O mesmo exemplo do slide 4 pode
ser encontrado no Exemplo2.c,
dessa vez, usando a struct Thread
![Page 16: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/16.jpg)
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
![Page 17: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/17.jpg)
A implementação
• Foram utilizadas as seguintes
funções da API do Windows:
−CreateThread−GetExitCodeThread−Sleep
![Page 18: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/18.jpg)
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
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
![Page 19: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/19.jpg)
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);
![Page 20: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/20.jpg)
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
![Page 21: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/21.jpg)
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
);
![Page 22: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/22.jpg)
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”);
}
![Page 23: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/23.jpg)
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
![Page 24: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/24.jpg)
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
);
![Page 25: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/25.jpg)
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().
![Page 26: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/26.jpg)
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);
![Page 27: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/27.jpg)
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
![Page 28: Introdução à Threads para Windows na linguagem C Modularizando Threads em uma struct C Luiz Carlos d´Oleron lcadb@cin.ufpe.br](https://reader035.vdocuments.site/reader035/viewer/2022062623/552fc0f9497959413d8b6cf4/html5/thumbnails/28.jpg)
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