Baixe o app para aproveitar ainda mais
Prévia do material em texto
Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Threads Luiz Affonso Guedes1 Ivanovitch Silva1 affonso@dca.ufrn.br ivan@dca.ufrn.br 1Universidade Federal do Rio Grande do Norte 22 de outubro de 2009 Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 1 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Suma´rio 1 Introduc¸a˜o Definic¸a˜o Conceitos ba´sicos Thread overhead Histo´ria 2 Pthread API 3 Gerenciamento Criac¸a˜o Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 4 Mutexes 5 Classe Thread Objetivo Definic¸a˜o Exemplo 6 Exemplo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 2 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo 1 Introduc¸a˜o Definic¸a˜o Conceitos ba´sicos Thread overhead Histo´ria 2 Pthread API 3 Gerenciamento Criac¸a˜o Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 4 Mutexes 5 Classe Thread Objetivo Definic¸a˜o Exemplo 6 Exemplo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 3 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Definic¸a˜o Introduc¸a˜o O que e´ uma Thread Fluxo independente de instruc¸o˜es que pode ser escalonado para execuc¸a˜o de uma determinada tarefa Para um programador, uma Thread e´ um procedimento independente do programa principal (main) sendo executado paralelamente Suponha um programa com va´rias func¸o˜es. Se essas func¸o˜es podem ser executadas paralelamente enta˜o podemos dizer que esse programa utiliza multithreads Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 3 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Conceitos ba´sicos Concorreˆncia X paralelismo Concorreˆncia ocorre quando duas ou mais threads esta˜o ativas ao mesmo tempo Paralelismo ocorre quando duas ou mais threads esta˜o sendo executadas simulataneamente. O paralelismo real apenas ocorre em ma´quinas com multiprocessadores ou em clusters. Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 4 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Thread overhead Thread vs processos Threads existem dentro de um processo e usam seus recursos Podem compartilhar recursos com outras threads Finaliza se o processo a qual esta´ inserido tambe´m finaliza E´ considerada leve, pois a maioria do overhead e´ decorrente da criac¸a˜o do processo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 5 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Thread overhead Criac¸a˜o de 50.000 processos/threads Plataforma Fork (seg) Thread (seg) AMD 2.4 GHz Opteron (8cpus/node) 41.07 0.66 IBM 1.9 GHz POWER5 p5-575 (8cpus/node) 64.24 1.75 IBM 1.5 GHz POWER4 (8cpus/node) 104.05 2.01 INTEL 2.4 GHz Xeon (2 cpus/node) 54.95 1.64 INTEL 1.4 GHz Itanium2 (4 cpus/node) 54.54 2.03 Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 6 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Histo´ria Evoluc¸a˜o Tradicionalmente os diversos fornecedores de hardware forneciam suas pro´prias soluc¸o˜es de thread especı´ficas para um determinado hardware Para desenvolver a portabilidade em relac¸a˜o as threads foram criados alguns padro˜es. No UNIX, o padra˜o desenvolvido foi o IEEE POSIX 1003.1c (1995). Reviso˜es do padra˜o IEEE POSIX 1003.1c chamam as threads de POSIX thread ou Pthreads. As Pthreads sa˜o definidas como um conjunto da linguagem C. Sua implementac¸a˜o e´ encontrada no arquivo pthread.h Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 7 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo 1 Introduc¸a˜o Definic¸a˜o Conceitos ba´sicos Thread overhead Histo´ria 2 Pthread API 3 Gerenciamento Criac¸a˜o Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 4 Mutexes 5 Classe Thread Objetivo Definic¸a˜o Exemplo 6 Exemplo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 8 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Pthread API Na Pthread API sa˜o encontradas mais de 60 rotinas. As func¸o˜es de threads sa˜o classificadas em 3 grupos: Gerenciamento: criac¸a˜o, junc¸a˜o, separac¸a˜o, me´todos get e set dos atributos. Mutexes: sincronizac¸a˜o. Varia´veis de condic¸a˜o: trata da comunicac¸a˜o entre threads que compartilham um mutex. Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 8 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo 1 Introduc¸a˜o Definic¸a˜o Conceitos ba´sicos Thread overhead Histo´ria 2 Pthread API 3 Gerenciamento Criac¸a˜o Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 4 Mutexes 5 Classe Thread Objetivo Definic¸a˜o Exemplo 6 Exemplo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 9 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Criac¸a˜o Pthread API - Criando uma thread Sintaxe: int pthread create (pthread t thread, const pthread attr t atributo, (void *)*func¸a˜o(void *), void * param ) Paraˆmetros: thread - objeto thread usado no programa atributo - atributo da thread. Se NULL, a thread usa os valores padra˜o func¸a˜o - ponteiro para a func¸a˜o que implementara´ as funcionalidades da thread param - paraˆmetro simples da func¸a˜o que implementara´ as funcionalidades da thread Retorno: Sucesso se zero, caso contra´rio retorna co´digo do erro. Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 9 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Finalizar Pthread API - Finalizando uma thread Sintaxe: void pthread exit (void * status) status - status de finalizac¸a˜o. Geralmente NULL A func¸a˜o pthread exit() e´ usada para finalizar a thread de forma explı´cita. Se o me´todo main finaliza com a chamada de pthread exit(), todas as outras threads continuam seu processamento. Caso contra´rio, as outras threads sa˜o encerradas. Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 10 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo 01 Criando threads - Exemplo 01 Download 1 // Func¸a˜o auxiliar da thread 2 void∗ funcaoHelper (void∗ idThread ) { 3 sleep ( 3 ) ; 4 printf ( ” Thread : %d\n ” , (int ) idThread ) ; 5 //Finalizar de forma explı´cita a thread 6 pthread_exit (NULL ) ; 7 } 8 int main (int argc , char ∗argv [ ] ){ 9 //Vetor de threads 10 p th read t vetorThreads [NUM THREADS ] ; 11 //Status de criac¸a˜o 12 int sta tusRetorno ; 13 //Loop para criar as threads 14 for (int i =0; i < NUM THREADS; i ++){ 15 printf ( ” Criando a thread : %d\n ” , i ) ; 16 //Criar a thread i 17 statusRetorno = pthread_create(& vetorThreads [ i ] , NULL, funcaoHelper , (void ∗) i ) ; 18 //Verificando a existeˆncia de erros na criac¸a˜o 19 if ( s ta tusRetorno ){ 20 printf ( ” Erro ao c r i a r a thread : %d\n ” , s ta tusRetorno ) ; 21 exit(−1); 22 } 23 } 24 printf ( ” F ina l i zando o me´todo main\n ” ) ; 25 pthread_exit (NULL ) ; 26 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 11 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo 02 Criando threads - Exemplo 02 Download 1 // Func¸a˜o auxiliar da thread 2 void∗ funcaoHelper (void∗ idThread ) { 3 sleep ( 3 ) ; 4 printf ( ” Thread : %d\n ” , (int ) idThread ) ; 5 //Finalizar de forma explı´cita a thread 6 pthread_exit (NULL ) ; 7 } 8 int main (int argc , char ∗argv [ ] ){ 9 //Vetor de threads 10 p th read t vetorThreads [NUM THREADS ] ; 11 //Statusde criac¸a˜o 12 int sta tusRetorno ; 13 //Loop para criar as threads 14 for (int i =0; i < NUM THREADS; i ++){ 15 printf ( ” Criando a thread : %d\n ” , i ) ; 16 //Criar a thread i 17 statusRetorno = pthread_create(& vetorThreads [ i ] , NULL, funcaoHelper , (void ∗) i ) ; 18 //Verificando a existeˆncia de erros na criac¸a˜o 19 if ( s ta tusRetorno ){ 20 printf ( ” Erro ao c r i a r a thread : %d\n ” , s ta tusRetorno ) ; 21 exit(−1); 22 } 23 } 24 printf ( ” F ina l i zando o me´todo main\n ” ) ; 25 exit ( 0 ) ; 26 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 12 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo 03 Criando threads - Exemplo 03 Download 1 //Estrutura usada como paraˆmetro da funcaoHelper 2 struct dataParam{ 3 int idThread ; 4 int va lo r ; 5 } ; 6 7 // Func¸a˜o auxiliar da thread 8 void∗ funcaoHelper (void∗ param ) { 9 printf ( ” Thread . i d : %d\n ” , ( (struct dataParam ∗) param)−>idThread ) ; 10 printf ( ” Thread . va l o r : %d\n ” , ( (struct dataParam ∗) param)−>va lo r ) ; 11 //Finalizar de forma explı´cita a thread 12 pthread_exit (NULL ) ; 13 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 13 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo 03 Criando threads - Exemplo 03 Download 1 int main (int argc , char ∗argv [ ] ){ 2 //Vetor de threads 3 p th read t vetorThreads [NUM THREADS ] ; 4 //Vetor da estrutura de paraˆmetro 5 struct dataParam vetorParam [NUM THREADS ] ; 6 //Status de criac¸a˜o 7 int sta tusRetorno ; 8 //Loop para criar as threads 9 for (int i =0; i < NUM THREADS; i ++){ 10 //Inicializando o vetor de parametros 11 vetorParam [ i ] . idThread = i ; 12 vetorParam [ i ] . va l o r = i ∗10; 13 printf ( ” Criando a thread : %d\n ” , i ) ; 14 //Criar a thread i 15 statusRetorno = pthread_create(& vetorThreads [ i ] , NULL, funcaoHelper , 16 (void ∗)&vetorParam [ i ] ) ; 17 //Verificando a existeˆncia de erros na criac¸a˜o 18 if ( s ta tusRetorno ){ 19 printf ( ” Erro ao c r i a r a thread : %d\n ” , s ta tusRetorno ) ; 20 exit(−1); 21 } 22 } 23 printf ( ” F ina l i zando o me´todo main\n ” ) ; 24 pthread_exit (NULL ) ; 25 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 14 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Join Sincronizando threads Join e´ um mecanismo para sincronizar as threads Bloqueia quem chamou o join ate´ que a thread alvo seja finalizada O programador pode obter o estado de finalizac¸a˜o da thread atrave´s do atributo status na chamada da func¸a˜o pthread exit(status) Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 15 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Join Me´todo join Sintaxe: void pthread join (pthread t thread, void * *status) thread - objeto thread a qual deseja esperar finalizac¸a˜o status - estado de retorno da thread especificada no primeiro paraˆmetro Retorno: Zero se sucesso ou co´digo do erro. Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 16 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo 4 Join - Exemplo 04 Download 1 // Func¸a˜o auxiliar da thread 2 void∗ funcaoHelper (void∗ idThread ) { 3 . . . 4 //Finalizar com o co´digo de retorno igual ao idThread 5 pthread_exit ( (void ∗) idThread ) ; 6 } 7 int main (int argc , char ∗argv [ ] ){ 8 . . . 9 //Status de finalizac¸a˜o da thread 10 void ∗ s ta tusF ina l i zacao ; 11 //Criar as threads 12 . . . 13 //Realizando um join com todas as threads 14 for (int i =0; i < NUM THREADS; i ++){ 15 //Main fica bloqueado ate´ vetorThreads[i] finalizar 16 statusRetorno = p t h r e a d j o i n ( vetorThreads [ i ] , &s ta tusF ina l i zacao ) ; 17 if ( s ta tusRetorno ){ 18 printf ( ” Erro ao executar t h r e a d j o i n : %d\n ” , s ta tusRetorno ) ; 19 exit(−1); 20 } 21 printf ( ” Jo in f i n a l i z a d o para a thread : %d com o codigo : %d\n ” , i , 22 (int ) s t a tusF ina l i zacao ) ; 23 } 24 printf ( ” F ina l i zando o metodo main\n ” ) ; 25 pthread_exit (NULL ) ; 26 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 17 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo 1 Introduc¸a˜o Definic¸a˜o Conceitos ba´sicos Thread overhead Histo´ria 2 Pthread API 3 Gerenciamento Criac¸a˜o Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 4 Mutexes 5 Classe Thread Objetivo Definic¸a˜o Exemplo 6 Exemplo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 18 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Introduc¸a˜o Mutex significa exclusa˜o mu´tua Utilizada para sincronizac¸a˜o e evitar condic¸o˜es de corrida, sa˜o os sema´foros das threads Para fornecer esse tipo de sincronizac¸a˜o, sera´ utilizado a classe sema´foro introduzida nas aulas passadas. Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 18 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo 1 Introduc¸a˜o Definic¸a˜o Conceitos ba´sicos Thread overhead Histo´ria 2 Pthread API 3 Gerenciamento Criac¸a˜o Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 4 Mutexes 5 Classe Thread Objetivo Definic¸a˜o Exemplo 6 Exemplo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 19 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Objetivo Finalidade da Classe Thread Classe desenvolvida para auxiliar a utilizac¸a˜o de threads A ide´ia e´ que essa classe seja base para outras classes especializadas Devemos enta˜o criar uma outra classe que herde da classe Thread Todo procedimento da thread e´ implementado no me´todo run Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 19 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Definic¸a˜o Thread.h Download 1 #include <pthread . h> 2 class Thread 3 { 4 private : 5 //Funcao auxiliar da Thread 6 static void∗ funcaoHelper (void∗ ) ; 7 //POSIX thread da classe 8 p th read t thread ; 9 public : 10 //Construtor 11 Thread ( ) ; 12 //Destrutor virtual. 13 virtual ˜ Thread ( ) ; 14 //Metodo virtual puro 15 virtual void run ( ) = 0 ; 16 //Metodo deve ser executado para iniciar a thread 17 int s t a r t ( ) ; 18 //Bloqueia ate thread ser finalizada 19 int wai t ( ) ; 20 //Retornar o thread da classe 21 //Lembrando que um metodo const nao pode modificar atributos da classe 22 p th read t getThread (void ) const ; 23 } ; Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 20 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Definic¸a˜o Thread.cpp Download 1 #include ” Thread . h ” 2 //Construtor 3 Thread : : Thread (){} 4 //Destrutor 5 Thread : : ˜ Thread (){} 6 /* 7 Responsavel por chamar a funcao run. 8 Apos finalizar o metodo run, a thread 9 devera chamar o destrutor 10 */ 11 void∗ 12 Thread : : funcaoHelper (void ∗param ) 13 { 14 ( ( Thread∗) param )−>run ( ) ; 15 return 0; 16 } 17 /* 18 Inicia a thread. Devera ser a primeira funcao 19 executada apos o construtor. 20 Retorna o codigo de erro da criacao da thread 21 */ 22 int 23 Thread : : s t a r t ( ) 24 { 25 return pthread_create(& thread , NULL, Thread : : funcaoHelper , ( void∗)this ) ; 26 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 21 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Definic¸a˜o Thread.cpp Download 1 2 . . . 3 4 /* 5 Funcao que espera pela finalizacao da thread. 6 Pode ser chamada para sincronizacao dentro de 7 algum procedimento 8 */ 9 10 int 11 Thread: : wa i t ( ) 12 { 13 return p t h r e a d j o i n ( thread , NULL ) ; 14 } 15 16 /* 17 Retorna o objeto thread da classe 18 */ 19 p th read t 20 Thread : : getThread ( ) const 21 { 22 return thread ; 23 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 22 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Problema dos trens Trem Pode ser visto como uma thread Caminho Conjunto de trilhos Conjunto de sema´foros Controle de velocidade Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 23 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Trilhos.h Download 1 #include <vector> 2 using namespace s td ; 3 class T r i l h o s 4 { 5 public : 6 //Construtor 7 //vetor de inteiro representando o trilho e o id 8 T r i l h o s ( vector<int>, int ) ; 9 //Destrutor 10 ˜ T r i l h o s ( ) ; 11 //Retorna o trilho 12 int g e t I d T r i l h o ( ) const ; 13 //Retorna o caminho 14 vector<int> getCaminho ( ) const ; 15 void s e t I d T r i l h o (int ) ; 16 private : 17 //Identificador dos trilhos 18 int i d T r i l h o ; 19 //Trilho que sera´ percorrido pelos trens 20 vector<int> caminho ; 21 } ; Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 24 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Trilhos.cpp Download 1 #include ” T r i l h o s . h ” 2 /* 3 Construtor 4 trilho = caminho que sera´ percorrido pelo trem 5 */ 6 T r i l h o s : : T r i l h o s ( vector<int> t r i l h o , int i d ) 7 { 8 caminho = t r i l h o ; 9 i d T r i l h o = i d ; 10 } 11 /* 12 Retorna o identificador dos trilhos 13 */ 14 int 15 T r i l h o s : : g e t I d T r i l h o ( ) const 16 { 17 return i d T r i l h o ; 18 } 19 /* 20 Retorna o caminho onde o trem ira percorrer 21 */ 22 vector<int> 23 T r i l h o s : : getCaminho ( ) const 24 { 25 return caminho ; 26 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 25 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Trem.h Download 1 #include ” Thread . h ” 2 #include ” Semaforo . h ” 3 #include ” T r i l h o s . h ” 4 #include <vector> 5 using namespace s td ; 6 class Trem : public Thread 7 { 8 public : 9 /*Construtor 10 Parametros: idTrem, vetor de semaforos, vetor de trilhos,velocidade 11 */ 12 Trem (int , vector<Semaforo∗>,vector<T r i l h o s∗>,int ) ; 13 //Destrutor 14 ˜ Trem (void ) ; 15 //No me´todo run, sera´ implementado o loop de execuc¸a˜o do trem 16 void run ( ) ; 17 //Metodo para andar no trilho. 18 void mover ( ) ; 19 //Metodos get e set dos atributos. Fazer o restante para os outros 20 //atributos 21 void setIdTrem (int ) ; 22 //Metodos const na˜o podem alterar os atributos da classe 23 int getIdTrem (void ) const ; Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 26 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Trem.h Download 1 . . . 2 3 private : 4 // Identificador do trem 5 int idTrem ; 6 7 // Posicao do trem no trilho 8 // posicao[0] - posicao em vetorTrilhos[] 9 // posicao[1] - posicao em Trilho.caminho[] 10 int posicao [ 2 ] ; 11 12 // Vetor de semaforos 13 vector<Semaforo∗> vetorSemaforos ; 14 15 // Vetor de trilhos 16 vector<T r i l h o s∗> v e t o r T r i l h o s ; 17 18 // Velocidade 19 int veloc idade ; 20 } ; Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 27 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Trem.cpp Download 1 #include ” Trem . h ” 2 #include <s t d i o . h> 3 #include <un is td . h> 4 /* 5 O construtor da classe Trem 6 Parametros: 7 identificador - id do trem 8 vetorSemaforos - vetor com os semaforos utilizados pelo trem 9 vetorTrilhos 10 */ 11 Trem : : Trem ( int id , 12 vector<Semaforo∗> vetorSem , 13 vector<T r i l h o s∗> vetorTr , 14 int speed 15 ) 16 { 17 idTrem = i d ; 18 vetorSemaforos = vetorSem ; 19 v e t o r T r i l h o s = ve to rT r ; 20 posicao [ 0 ] = 0 ; 21 posicao [ 1 ] = 0 ; 22 veloc idade = speed ; 23 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 28 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Trem.cpp Download 1 void 2 Trem : : mover ( ) 3 { 4 // Verificar se ja´ atingiu o limite do caminho dentro do Trilho atual 5 if ( posicao [ 1 ] == ( ( v e t o r T r i l h o s . a t ( posicao [ 0 ] ) )−>getCaminho ( ) ) . capac i t y ( ) −1) 6 { 7 //Verificar se ja´ foi dado uma volta completa 8 if ( posicao [ 0 ] == v e t o r T r i l h o s . capac i t y ( ) − 1) 9 { 10 posicao [ 0 ] = 0 ; 11 posicao [ 1 ] = 0 ; 12 } 13 //Se uma volta ainda na˜o foi dada, incrementa para o inicio do proximo trilho 14 else 15 { 16 posicao [ 0 ] + + ; 17 posicao [ 1 ] = 0 ; 18 } 19 } 20 //Apenas incrementa o caminho atual 21 else 22 { 23 posicao [ 1 ] + + ; 24 } 25 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 29 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Exemplo Trem.cpp Download 1 2 /* 3 Metodo que implementara o loop de execuc¸a˜o da thread 4 */ 5 void 6 Trem : : run ( ) 7 { 8 while (true ) 9 { 10 if ( idTrem == 1){ 11 printf ( ” P i u i i i i i i i i i i , sou o trem : %d\n ” , idTrem ) ; 12 printf ( ” Minha posicao : %d\n\n ” , 13 ( ( v e t o r T r i l h o s . a t ( posicao [ 0 ] ) )−>getCaminho ( ) ) . a t ( posicao [ 1 ] ) ) ; 14 mover ( ) ; 15 sleep ( ve loc idade ) ; 16 } 17 } 18 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 30 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo 1 Introduc¸a˜o Definic¸a˜o Conceitos ba´sicos Thread overhead Histo´ria 2 Pthread API 3 Gerenciamento Criac¸a˜o Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 4 Mutexes 5 Classe Thread Objetivo Definic¸a˜o Exemplo 6 Exemplo Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 31 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo main.cpp Download 1 #include <s t d l i b . h> 2 #include <s t d i o . h> 3 #include <un is td . h> 4 #include ” Trem . h ” 5 int 6 main (int argc , char ∗argv [ ] ) 7 { 8 // Criando os caminhos dos trilhos 9 const int aux caminho1 [ ] = {1 ,2 ,3 ,4 ,5 ,6 ,7} ; 10 const int aux caminho2 [ ] = {8 ,9}; 11 const int aux caminho3 [ ] = {10 ,11 ,12 ,13 ,14 ,15 ,16} ; 12 const int aux caminho4 [ ] = {17 ,18}; 13 14 vector<int> caminho1 ( aux caminho1 , aux caminho1 +7) ; 15 vector<int> caminho2 ( aux caminho2 , aux caminho2 +2) ; 16 vector<int> caminho3 ( aux caminho3 , aux caminho3 +7) ; 17 vector<int> caminho4 ( aux caminho4 , aux caminho4 +2) ; 18 19 T r i l h o s ∗ t r i l h o 1 = new T r i l h o s ( caminho1 , 1 ) ; 20 T r i l h o s ∗ t r i l h o 2 = new T r i l h o s ( caminho2 , 2 ) ; 21 T r i l h o s ∗ t r i l h o 3 = new T r i l h o s ( caminho3 , 3 ) ; 22 T r i l h o s ∗ t r i l h o 4 = new T r i l h o s ( caminho4 , 4 ) ; Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 31 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo main.cpp Download 1 // Criando os semaforo usados no programa 2 Semaforo ∗sem1 ; 3 4 // VARIAVEIS DO TREM 5 6 // vetor de semaforos 7 vector<Semaforo∗> vetorSemaforo ; 8 vetorSemaforo . push back (sem1 ) ; 9 10 // vetor de trilhos 11 vector<T r i l h o s∗> v e t o r T r i l h o s ; 12 v e t o r T r i l h o s . push back ( t r i l h o 1 ) ; 13 v e t o r T r i l h o s . push back ( t r i l h o 2 ) ; 14 v e t o r T r i l h o s . push back ( t r i l h o 3 ) ; 15 v e t o r T r i l h o s . push back ( t r i l h o 4 ) ; 16 17 //Criandoum Trem 18 Trem ∗trem1 = new Trem (1 , vetorSemaforo , v e t o r T r i l h o s , 2 ) ; 19 20 //Inicializando o trem 21 trem1−>s t a r t ( ) ; 22 23 pthread_exit (NULL ) ; 24 return 0; 25 } Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 32 / 33 Suma´rio Introduc¸a˜o Pthread API Gerenciamento Mutexes Classe Thread Exemplo Compilar g++ -pthread -o exe main.cpp Semaforo.cpp Trilhos.cpp Thread.cpp Trem.cpp Threads DCA0109 - Pra´tica de programac¸a˜o concorrente 33 / 33 Sumário Introdução Definição Conceitos básicos Thread overhead História Pthread API Gerenciamento Criação Finalizar Exemplo 01 Exemplo 02 Exemplo 03 Join Exemplo 4 Mutexes Classe Thread Objetivo Definição Exemplo Exemplo
Compartilhar