fundamentos2-slidesc++18-2010-05-20_antigo

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 a cordo com POSIX. OO Engen har ia Eletrôni ca Prof. Jean Marcelo SIMÃO

Upload: luciano-alves-machado

Post on 17-Jul-2015

19 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fundamentos2-SlidesC++18-2010-05-20_Antigo

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

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

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

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

5/14/2018 Fundamentos2-SlidesC++18-2010-05-20_Antigo - slidepdf.com

http://slidepdf.com/reader/full/fundamentos2-slidesc18-2010-05-20antigo 5/24

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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