Buscar

Thread no c++

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 39 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 39 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 39 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Outros materiais