fundamentos2-slidesc++18-2010-05-20_antigo
TRANSCRIPT
![Page 1: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/1.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 1/24
-
Programação em C/C++
Slides 18: Introdução à Multithreading.
Introdução à Multithreading: execução concorrente de tarefas.
Exemplos usando a ‘biblioteca’ pthread que é de acordo com POSIX.
OO – Engenharia Eletrônica
Prof. Jean Marcelo SIMÃO
![Page 2: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/2.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 2/24
Multithreading: execuçãoconcorrente de tarefas
Obs.: Material inicial elaborado por Murilo S. Holtman no 2o Semestre de 2007. O
Holtman era então aluno da disciplina em questão e estagiário em projeto do Professorda disciplina.
![Page 3: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/3.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 3/24
Threads
• Thread é o nome dado a uma tarefa (e ao conjuntode estruturas associado a ela) que é executadaconcorrentemente com outras tarefas.
• São amplamente utilizadas por todo tipo desoftware: servidores, browsers, jogos, programas
que efetuam cálculos e pesquisas demoradas, entremuitos outros.
![Page 4: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/4.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 4/24
Implementações de
execução concorrente
• Em modelos e sistemas operacionais mais antigos, eracomum o uso das chamadas user-level threads (threads
implementadas pelos próprios aplicativos).
• A maioria dos sistemas operacionais modernos suporta aexecução de múltiplas tarefas gerenciadas pelo próprio
kernel, que lida com sua alocação, destruição eagendamento.
![Page 5: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/5.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 5/24
L
i nh a pr i n c i p a l
Nova thread
Nova thread
Espera
![Page 6: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/6.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 6/24
Problemas no uso de threads
• O principal problema em programas com várias linhas deexecução paralelas diz respeito à sincronização no acesso arecursos compartilhados (blocos de memória, arquivos,dispositivos, etc.) por várias tarefas.
• Estes problemas são circundados ao se escrever códigoseguro (thread-safe) que inclui a utilização de rotinas
reentrantes e objetos de sincronização (como semáforos emutexes).
![Page 7: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/7.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 7/24
Exemplo de conflito entre threads
que acessam um mesmo recursoTarefa da thread 1:
{{
......charchar *s;*s;
forfor (s =(s = ““ABCDEFABCDEF””; *s !=; *s != ‘‘\\00’’; s++); s++)
{{
fputcfputc(*s,(*s, stdoutstdout););
}}
......
}}
Tarefa da thread 2:
{{
......charchar *s;*s;
forfor (s =(s = ““123456123456””; *s !=; *s != ‘‘\\00’’; s++); s++)
{{
fputcfputc(*s,(*s, stdoutstdout););
}}
......}}
Considerando o seguinte contexto: (a) a fatia de tempo destinado a thread 1, pelo sistema
operacional, se esgota enquanto ela ainda está executando seu laço de repetição; (b) athread 2 é então executada de maneira intercalada com a thread 1; (c) isto se repetealgumas vezes. Assim sendo, a saída padrão (“tela”) poderá conter algo como:
ABC1D2E3F456
![Page 8: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/8.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 8/24
POSIX Threads (Pthreads)
• Uma padronização desenvolvida pelo comitê POSIX(Portable Operating System Interface) para tornar osprogramas que utilizam threads portáveis através devárias plataformas.
• Inclui suporte à criação e controle de threads e a
alguns objetos de sincronização básicos.
![Page 9: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/9.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 9/24
Elementos Básico de threading na ‘biblioteca’ Pthreads
• pthread_create() cria uma nova thread , que pode (ou não) começar a executarimediatamente após a chamada ter sido concluída.
int pthread_create (
pthread_t *thread ,
const pthread_attr_t *attr ,
void *(*start_routine)(void*),
void *arg
);
• pthread_exit() é chamada no contexto de uma thread criada por
pthread_create() e faz com que essa thread seja finalizada.
void pthread_exit(
void *value_ptr
);
pthread_create e pthread_exit
![Page 10: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/10.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 10/24
join e detach
• Uma thread pode aguardar pela finalização de outra thread através depthread_join().
int pthread_join(
pthread_t thread ,
void **value_ptr
);
Elementos Básico de threading na ‘biblioteca’ Pthreads
• pthread_detach() avisa à implementação subjacente que a thread
especificada deve ser liberada assim que terminar.
int pthread_detach (
pthread_t *thread
);
![Page 11: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/11.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 11/24
Mutexes ( mutually exclusive)
• Um mutex permite acesso de uma thread por vez a um recuso através de uma travamutualmente exclusiva ( mutually exclusive).
• A função pthread_mutex_init() e a função pthread_mutex_destroy()respectivamente criam e liberam um objeto mutex.
int pthread_mutex_init (
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr
);
int pthread_mutex_destroy ( pthread_mutex_t *mutex );
• Mutexes devem ter sido inicializados antes de serem utilizados (no contexto das threads)pelas seguintes funções:
int pthread_mutex_lock ( pthread_mutex_t *mutex );
int pthread_mutex_trylock ( pthread_mutex_t *mutex );
int pthread_mutex_unlock ( pthread_mutex_t *mutex );
![Page 12: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/12.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 12/24
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t meu_mutex;
struct limite
{
int baixo;
int alto;
};
struct limite limite_1, limite_2;
void* encontra_primos ( void *param );
int main ( )
{
pthread_t thd1, thd2;
pthread_mutex_init( &meu_mutex, NULL );
limite_1.baixo = 0;
limite_1.alto = 1000;
pthread_create ( &thd1, NULL,
encontra_primos, &limite_1);
limite_2.baixo = 1000;
limite_2.alto = 2000;
pthread_create ( &thd2, NULL,encontra_primos, &limite_2);
pthread_join ( thd1, NULL );
pthread_join ( thd2, NULL );
pthread_mutex_destroy ( &meu_mutex );
system ( "pause" ) ;
return 0;
}
void* encontra_primos( void *param )
{
struct limite *aux;
aux = (struct limite *) param;
int n, k;
int primo;
for ( n = aux->baixo; n <= aux->alto; n++ )
{
primo = 1;
for ( k = 2; k < n; k++ )
{
if ( (n % k) == 0 )
{
primo = 0;
break;
}
}
if ( primo )
{
pthread_mutex_lock ( &meu_mutex );
printf ( " %u \n ", n );
pthread_mutex_unlock( &meu_mutex );
}
}
pthread_exit ( NULL );
}
![Page 13: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/13.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 13/24
Primos de 0 a 1000 Primos de 1001 a 2000pthread_join()
pthread_create()pthread_create()
![Page 14: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/14.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 14/24
![Page 15: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/15.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 15/24
Mais informações (técnicas)
• Para instalar em Dev C++
– Ir no menu Ferramentas e depois no sub-menu Atualizações (++). No campo ‘Select
devpack server ’ selecionar ‘devpaks.org Community Devpacks’ e então clicar no botão
‘Check for updates’.– Após as atualizações, selecionar item relativo a Pthreads e clicar no botão ‘ Download
selected ’. Uma vez realizando o download ativa-se um instalador.
– Ao compilar um projeto com pthread, pode acontecer um erro causado pela falta dosarquivos libpthreadGC2.a e pthreadGC2.dll. O primeiro se encontra no diretório
(default ): ‘...\DevC++\Dev-Cpp\lib‘ e o segundo pode ser encontrado no link:‘ftp://sourceware.org/pub/pthreads-win32/dll-latest/lib/’. (último acesso em20/05/2010).
– O arquivo libpthreadGC2.a deve ser adicionado ao projeto indo no menu Projeto, depoisno sub-menu Opções de Projeto e clicando-se em Adicionar Biblioteca.
– O arquivo pthreadGC2.dll deve ser adicionado aos arquivos do Dev C++ ( \DevC++\Dev-Cpp\bin) ou as pastas do sistema operacional, como ‘C:\Windows\System32’, que alémde não ser recomendado, ainda pode ser mais trabalhoso, devido aos sistemas desegurança dos sistemas operacionais modernos.
![Page 16: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/16.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 16/24
Mais informações (técnicas)
• Para instalar Pthread em outros...
– Pesquisar na internet...
– Talvez em: http://koti.mbnet.fi/outgun/documentation/compiler_install.html#pthreads
Obs. : Último acesso foi em 19/05/2008, às 21:05.
• Infos
– http://sources.redhat.com/pthreads-win32/
Obs. : Último acesso foi em 19/05/2008, às 21:05.
• Infos
– http://www.opengroup.org/onlinepubs/007908799/xsh/pthread.h.html
– Todas as man pages relativas a Pthreads.
Obs. : Último acesso foi em 19/05/2008, às 20:07.
![Page 17: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/17.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 17/24
Apenas Lembrando: Número primo
Origem: Wikipédia, a enciclopédia livre.
Número primo é um número inteiro com apenas quatro divisores inteiros: 1, -1, seuoposto e ele mesmo. Por exemplo, o número 3 é um número primo pois seus dois únicosdivisores inteiros são 1 e 3, -1 e -3. Se um número inteiro tem módulo maior que 1 e nãoé primo, diz-se que é composto. Os números 0 e 1 não são considerados primos nemcompostos.
O conceito de número primo é muito importante na teoria dos números. Um dosresultados da teoria dos números é o Teorema Fundamental da Aritmética, que afirma
que qualquer número natural pode ser escrito de forma única (desconsiderando a ordem)como um produto de números primos (chamados fatores primos): este processo sechama decomposição em fatores primos (fatoração).
Os 25 primeiros números primos positivos são:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97...
![Page 18: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/18.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 18/24
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t console_mutex;
struct nrange
{
unsigned low;
unsigned high;
} range1, range2;
void *find_primes(void *param);
int main(int argc, char **argv)
{ pthread_t thd1, thd2;
pthread_mutex_init(&console_mutex, NULL);
range1.low = 0;
range1.high = 1000;
pthread_create ( &thd1, NULL,
find_primes, &range1);
range2.low = 1000;
range2.high = 2000;
pthread_create ( &thd2, NULL,find_primes, &range2);
pthread_join ( thd1, NULL );
pthread_join ( thd2, NULL );
pthread_mutex_destroy ( &console_mutex );
fgetc ( stdin );return 0;
}
void *find_primes( void *param )
{
struct nrange *range = (struct nrange*)param;
unsigned n, k;
int prime;
for (n = range->low; n <= range->high; n++)
{
prime = 1;
for (k = 2; k < n; k++)
{
if ( (n % k) == 0 )
{
prime = 0;
break;
}
}
if (prime)
{
pthread_mutex_lock(&console_mutex);
printf ( "%u\n", n );
pthread_mutex_unlock(&console_mutex);
}
}
pthread_exit(NULL);
}
quem interessar possa – outra versão do mesmo programa.
![Page 19: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/19.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 19/24
Atividades – Exercícios
• Estudar Semáforos em Pthread .
• Pesquisar/Estudar como programar com Pthread demaneira orientada a objetos.
• Vide– http://www.linuxselfhelp.com/HOWTO/C++Programming-HOWTO-18.html
– http://threads.sourceforge.net/
![Page 20: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/20.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 20/24
Threads
Windows
![Page 21: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/21.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 21/24
Threads em Windows
• Além de pthread , na programação (C/C++) para S.O.Windows, pode-se utilizar as seguintes alternativas:
– C run-time libraries (que faz parte da Microsoft Run-timeLibrary).
– Win 32 API.
• Veja a próxima aula.
• Veja a bibliografia indicada em uma próximatransparência (abaixo)
![Page 22: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/22.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 22/24
C run-time libraries
• C run-time libraries faz parte da Microsoft Run-timeLibrary.
• “O Microsoft run-time library provê rotinas paraprogramar o sistema operacional Microsoft Windows.Estas rotinas automatizam muitas tarefas comuns de
programação que não são providas pelas linguagens C eC++” [Microsoft Visual C++ Help].
![Page 23: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/23.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 23/24
WinWin 32 API32 API
• O Win32 API (também conhecido como Windows API)é um arquétipo ( framework ) baseado em C para acriação de aplicações Windows, e já estava disponível à
partir das primeiras versões do Windows.
![Page 24: Fundamentos2-SlidesC++18-2010-05-20_Antigo](https://reader031.vdocuments.pub/reader031/viewer/2022020808/5571ffdb49795991699e4a47/html5/thumbnails/24.jpg)
5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com
http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 24/24
Bibliografias relativas a Threads.
• SCHILDT, H.: The Art of C++. McGraw-Hill Osborne Media.1ª Edição (Paperback) 2004. ISBN-10: 0072255129
• RICHARD, H. C.; KUO-CHUNG, T.: Modern Multithreading:Implementing, Testing, and Debugging Multithreaded Javaand C++/Pthreads/Win32 Programs. Wiley-Interscience
(Paperback) 2005. ISBN-10: 0471725048
• HUGHES C; HUGHES T.: Object-Oriented MultithreadingUsing C++. Wiley; (Paperback) 1997. ISBN-10: 0471180122.
• HUGHES C; HUGHES T.: Professional MulticoreProgramming: Design and Implementation for C++
Developers. Wrox (Paperback) 2008. ISBN-10: 0470289627