• Nenhum resultado encontrado

Pthreads Em C

N/A
N/A
Protected

Academic year: 2021

Share "Pthreads Em C"

Copied!
36
0
0

Texto

(1)

S

Su

um

´

a

arriio

o

1

1 AAllococaa¸¸c˜c˜ao de mem´ao de mem´oorriiaa 22

2 2 O O qquue e ´´e e uumma a tthhrreeaadd? ? 44 3 3 O O qquue e ss˜˜aao o PPTThhrreeaaddss? ? 66 4 4 CCrriiaannddo o PPTThhrreeaadds s 66 5

5 PPaassssaannddo o AArrgguummeennttoos s ppaarra a PPTThhrreeaadds s 88 6

6 JJuunnttaannddo o e e ccoonnttrroollaannddo o PPTThhrreeaadds s 99 7

7 O O uusso o ddee   mutex   mutex  1313

8

8 O uO uso so de de vvarari´i´aveis de condi¸aveis de condi¸cc˜˜aaoo 1166

Nota

Nota

A primeira se¸

A primeira se¸c˜c˜ao deste documento trata de aloca¸ao deste documento trata de aloca¸c˜c˜ao de mem´ao de mem´oria para pro-oria para pro-gramas escritos em C, o leitor que conhe¸

gramas escritos em C, o leitor que conhe¸ca bem este assunto, pode pularca bem este assunto, pode pular diretamente para a segunda se¸

diretamente para a segunda se¸c˜c˜ao, ao, sem sem preprejuju´´ızoızos.s. Este

Este texttexto o ´´e e distridistribubu´´ıdo ıdo junto junto com com o o arquiarquivovo programas.tgz programas.tgz  qu que e cocont´nt´emem todos os c´

todos os c´odigos fonte dos programas exibidos em exemplos neste texto.odigos fonte dos programas exibidos em exemplos neste texto.

(2)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(3)

1

1 A

Allo

oc

ca

¸

a

ao

o de

de m

mem

em´

´

oria

oria

Quando executamos um programa que foi escrito em C, o sistema Quando executamos um programa que foi escrito em C, o sistema operaci-onal carrega na mem´

onal carrega na mem´oria o c´oria o c´odigo execut´odigo execut´avel do programa em uma ´avel do programa em uma ´area daarea da mem´

mem´oria. A esta ´oria. A esta ´area damos o nome dearea damos o nome de ´  ´ area de textoarea de texto. . Em sEm seguideguida ´a ´e ale alocaocadada mem´

mem´oria para todas as vari´oria para todas as vari´aveis globais, e ent˜aveis globais, e ent˜ao uma ´ao uma ´area para as vari´area para as vari´aveisaveis que s˜

que s˜ao declaradas pela fun¸ao declaradas pela fun¸c˜c˜ao principal do programa, fun¸ao principal do programa, fun¸c˜c˜aoao main main. . EsEsta ta ´´ee chamada de

chamada de ´ ´ area de dados area de dados .. Depois, inicia-se a execu¸

Depois, inicia-se a execu¸c˜c˜ao ao do do programaprograma, , isto ´isto ´e e feito pfeito porque orque o o sistemasistema operacional guarda um ponteiro para a ´

operacional guarda um ponteiro para a ´area de texto, de onde retira o c´area de texto, de onde retira o c´odigoodigo execut´

execut´avel e o envia para o processador, que se encarrega da execu¸avel e o envia para o processador, que se encarrega da execu¸c˜c˜ao.ao. O pr

O programograma ta tamb´amb´em pem possui ossui uma uma pilha pilha queque ´´e chae chamada mada dede pilha de execu¸ pilha de execu¸c˜ c˜ aoao,, que ´

que ´e e onde onde o o sistemsistema a operacional guarda operacional guarda as as informinforma¸a¸c˜c˜oes a respeito do es-oes a respeito do es-tado do programa (valores dos registradores, ponteiros para instru¸

tado do programa (valores dos registradores, ponteiros para instru¸c˜c˜oes, etc.)oes, etc.) quando a fun¸

quando a fun¸c˜c˜ao suspende sua execu¸ao suspende sua execu¸c˜c˜ao.ao. O programa pode suspender sua execu¸

O programa pode suspender sua execu¸c˜c˜ao por diversos motivos, o maisao por diversos motivos, o mais ´´obvi

obvio o ´´e e que que em em um um sistemsistema a mulmultitarefa preemptivo o titarefa preemptivo o sistemsistema a operacionaloperacional distribui

distribui  fatias de tempo  fatias de tempo para cada processo, ou seja, cada instˆ para cada processo, ou seja, cada instˆancia de umancia de um programa em execu¸

programa em execu¸c˜c˜ao. ao. QuaQuando o ndo o temtempo po ao qual o ao qual o procprocesesso tinhso tinha a didireireitoto se esgota, o sistema operacional, guarda o seu estado na pilha e o suspende, se esgota, o sistema operacional, guarda o seu estado na pilha e o suspende, colocando outro processo em execu¸

colocando outro processo em execu¸c˜c˜ao. ao. IstIsto o ´´e e feifeito to exatexatameamentnte e do do modomodo inverso, os valores na pilha de execu¸

inverso, os valores na pilha de execu¸c˜c˜ao deste processo s˜ao deste processo s˜ao restaurados e oao restaurados e o programa

programa ´´e e posto posto para para rodar.rodar. Outra maneira de uma fun¸

Outra maneira de uma fun¸c˜c˜ao ter sua execu¸ao ter sua execu¸c˜c˜ao ao suspsuspensa ´ensa ´e qe quando uando ela ela fazfaz uma chamada a outra fun¸

uma chamada a outra fun¸c˜c˜ao, ao, o o estado dela estado dela ´´e e guardado na guardado na pilha, mem´pilha, mem´oriaoria ´´e e alocalocada ada para para a a ´´area de dados da fun¸c˜area de dados da fun¸c˜ao, o sistema operacional guarda umao, o sistema operacional guarda um ponteiro para o lugar, na ´

ponteiro para o lugar, na ´area de texto, onde est´area de texto, onde est´a o c´a o c´odigo execut´odigo execut´avel doavel do programa e a execu¸

programa e a execu¸c˜c˜ao come¸ao come¸ca. ca. AnAnalalogogameamentnte e ao que ao que ocoocorre com orre com o main main,, que

que afinaafinal l de de contas contas tamb´tamb´em em ´´e e uma uma fun¸fun¸c˜c˜ao.ao. Sempre que uma fun¸

Sempre que uma fun¸c˜c˜ao chama outra os dados desta s˜ao chama outra os dados desta s˜ao armazenadosao armazenados na pilha, em espera, e uma nova linha de execu¸

na pilha, em espera, e uma nova linha de execu¸c˜c˜ao ´ao ´e cre criada. iada. Observe pObserve poror exemplo o seguinte programa:

exemplo o seguinte programa:

fatorial.c fatorial.c 1

1 # inc# include lude <stdi<stdio.h>o.h> 2

2 3

3 int fint fatoriatorial(inal(int a){t a){ 4

4 int int fat=fat=1;1; 5

5    if(a>1)if(a>1) 6

6 fat fat = = a a * * fatfatoriorial(al(a-1a-1););

(4)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(5)

7

7    elseelse 8

8 fafat t = = 11;; 9

9 returreturn n fat;fat; 10

10 }} 11 11 12

12 int int mainmain(){(){ 13

13 int int fat,fat,a;a; 14

14    scanf("%d",&a);scanf("%d",&a); 15

15 fat fat = = fatofatorial(rial(a);a); 16

16    printf("%d",fat);printf("%d",fat); 17

17 }}

No

No inin´´ıcio ıcio da da exeexecu¸cu¸c˜c˜ao o c´ao o c´odigo odigo compilado compilado do do programa ´programa ´e e colocado colocado na na ´´areaarea de texto, depois, a mem´

de texto, depois, a mem´oria correspondente `oria correspondente `as vari´as vari´aveisaveis fatfat ee aa ´ ´e e sesepapararadada,, criando a ´

criando a ´area de dados da fun¸area de dados da fun¸c˜c˜aoao main  main  e o processo come¸ e o processo come¸ca a ser executado.ca a ser executado. Ao chegar `

Ao chegar `a atribui¸a atribui¸c˜c˜ao na linha 13 o valor deao na linha 13 o valor de  fatorial(a)  fatorial(a)  deve ser avaliado deve ser avaliado antes

antes de de ser ser atribatribuu´´ıdo ıdo aa fatfat..

Isto ocorre suspendendo-se a execu¸

Isto ocorre suspendendo-se a execu¸c˜c˜ao daao da main  main , guardando seu contexto,, guardando seu contexto, e repetindo o procedimento para a fun¸

e repetindo o procedimento para a fun¸c˜c˜aoao  fatorial  fatorial. . CrCriaia-s-se a ´e a ´area de dadosarea de dados para guardar a vari´

para guardar a vari´avelavel fat fat, recupera-se o c´, recupera-se o c´odigo execut´odigo execut´avel na ´avel na ´area de textoarea de texto e executa-se a fun¸

e executa-se a fun¸c˜c˜ao, que, eventualmente, vai ser interrompida por outraao, que, eventualmente, vai ser interrompida por outra instˆ

instˆancia da fun¸ancia da fun¸c˜c˜aoao fatorial fatorial que ap´ que ap´os sua execu¸os sua execu¸c˜c˜ao vai permitir a retirada daao vai permitir a retirada da fun¸

fun¸c˜c˜ao no topo da pilha e assim sucessivamente.ao no topo da pilha e assim sucessivamente. O

O programa programa acima, acima, ´´e e tipicamente tipicamente seq¨seq¨uencial, j´uencial, j´a que cada vez que umaa que cada vez que uma chamada de fun¸

chamada de fun¸c˜c˜ao ao ´´e e feita feita o o programaprograma  depende   depende   deste valor para continuar  deste valor para continuar sua execu¸

sua execu¸c˜c˜ao. Mas tome por exemplo o seguinte programaao. Mas tome por exemplo o seguinte programa11

:: hipotenusa.c hipotenusa.c 1 1   #include<stdio.h>  #include<stdio.h> 2 2   #include<math.h>  #include<math.h> 3 3 4

4 int qint quadrauadrado(indo(int a){t a){ 5

5 int int quadquad;; 6

6 ququad ad = = a*a*a;a; 7

7 returreturn n quad;quad; 8

8 }} 9 9 10

10 int int mainmain(){(){ 11

11 int int hip, hip, hip_hip_quad;quad;

1 1

O leitor observar´

O leitor observar´a a que os que os programas aqui programas aqui exibidos levam uma exibidos levam uma s´s´erie de erie de etapas desne-etapas desne-cess´

cess´arias, todo o c´arias, todo o c´alculo da alculo da hipotenusa pohipotenusa poderia ter deria ter sido feito sido feito em uma em uma linha, plinha, por´or´em, em, motivosmotivos did´

did´aticos justificam esta constru¸aticos justificam esta constru¸c˜c˜ao.ao.

(6)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(7)

12

12 int int cateto1,catetocateto1,cateto1_quad;1_quad; 13

13 int int catecateto2, to2, catetcateto2_quo2_quad;ad; 14

14 scanf("%d scanf("%d %d",&cateto1,&ca%d",&cateto1,&cateto2);teto2); 15

15    cateto1_quad=quadrado(cateto1);cateto1_quad=quadrado(cateto1); 16

16    cateto2_quad=quadrado(cateto2);cateto2_quad=quadrado(cateto2); 17

17 hip_qhip_quad uad = = catecateto1_qto1_quad uad + + catetcateto2_quo2_quad;ad; 18

18 hip hip = = sqrtsqrt(hip_(hip_quad)quad);; 19

19    printf("%d\n",hip);printf("%d\n",hip); 20

20 }}

Quando a primeira chamada `

Quando a primeira chamada `a fun¸a fun¸c˜c˜aoao quadrado quadrado22

´´e e execuexecutada tada na na linha linha 15,15, o seu resultado s´

o seu resultado s´o ser´o ser´a necess´a necess´ario na linha 17. Isto quer dizer que n˜ario na linha 17. Isto quer dizer que n˜ao haveriaao haveria necessidade de interromper a execu¸

necessidade de interromper a execu¸c˜c˜ao da linha 16, enquanto a fun¸ao da linha 16, enquanto a fun¸c˜c˜ao executaao executa embora seja isto que acontece.

embora seja isto que acontece.

2

2 O que

O que ´

´

e uma thre

e uma t

hread?

ad?

Em um

Em um programa programa em C, em C, popoderder´´ıamos executaıamos executar as r as chamadas a chamadas a fun¸fun¸c˜c˜oes concor-oes concor-rentemente, se

rentemente, se pud´pud´essemos coessemos conseguir que nseguir que o sistema o sistema operacionaoperacional criasse l criasse umauma nova linha de execu¸

nova linha de execu¸c˜c˜ao, ao, de de certa certa maneira maneira um um novo pronovo processo. cesso. Isto Isto ´´e e possposs´´ıvelıvel nos sistemas

nos sistemas operacionais operacionais modernos modernos atrav´atrav´es do es do suporte suporte a threaa threads, uma ds, uma threadthread ´´e e um um prproocecesssso o quque e cocont´nt´emem::

• PID PID  (Process ID); (Process ID);

• pilha de execu¸ pilha de execu¸c˜c˜ao;ao;

•  registradores;  registradores;

• propriedades de escalonamento propriedades de escalonamento

Como

Como a a thread ´thread ´e e a a execu¸execu¸c˜c˜ao de uma fun¸ao de uma fun¸c˜c˜ao, ela precisa ter acesso aoao, ela precisa ter acesso ao c´

c´odigo execut´odigo execut´avel na ´avel na ´area de texto, bem como `area de texto, bem como `as vari´as vari´avaveis geis globlobaisais. . PaParara conseguir isto, o sistema operacional cria a thread como um processo que conseguir isto, o sistema operacional cria a thread como um processo que mant´

mant´em em os os mesmos mesmos ponteiros ponteiros para para a a ´´area de dados globais, e um ponteiroarea de dados globais, e um ponteiro para o lugar, dentro da ´

para o lugar, dentro da ´area de texto, onde est´area de texto, onde est´a o c´a o c´odigo da fun¸odigo da fun¸c˜c˜ao.ao.

2 2

N˜ao se esque¸ao se esque¸ca que para compilar este programa com oca que para compilar este programa com o gccgcc  ´  ´e e nenececessss´´ario passar oario passar o argumento

argumento -lm-lm

(8)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(9)

Al´

Al´em disto, em disto, para para que a que a thread thread possa possa receber receber parˆparˆametrametros os ela ela mant´mant´em em umum ´´

unico

unico ponteiro ponteiro para para um um bloco bloco contcont´´ıguo ıguo de de mem´mem´oria oria que que cont´cont´em em uma uma structstruct com todos seus argumentos.

com todos seus argumentos.

Em linguagem C, um ponteiro guarda um endere¸

Em linguagem C, um ponteiro guarda um endere¸co de mem´co de mem´oria e o for-oria e o for-mato dos dados armazenados em tal ponteiro, por exemplo, quando fazemos, mato dos dados armazenados em tal ponteiro, por exemplo, quando fazemos,

1

1 inint t a;a; 2

2 int int *pon*ponteiroteiro;; 3

3 ponponteiteiro = ro = &a;&a;

estamos n˜

estamos n˜ao s´ao s´o armazenando o lugar onde a vari´o armazenando o lugar onde a vari´avelavel aa est´ est´a sendo guardada,a sendo guardada, mas

mas tambtamb´´em em quanquantos tos bytes ocupa, bytes ocupa, podendo podendo assim usar assim usar a a constru¸constru¸c˜c˜aoao *pon-  *pon-teiro;

teiro; de  de maneirmaneira a idˆidˆentica entica ``a vari´a vari´avelavel aa..

Existe, no entanto, uma maneira de se ter um ponteiro n˜

Existe, no entanto, uma maneira de se ter um ponteiro n˜ao formatado, ouao formatado, ou seja, uma vari´

seja, uma vari´avel que guarde pura e simplesmente um endere¸avel que guarde pura e simplesmente um endere¸co da mem´co da mem´oria,oria, sem ter nenhuma informa¸

sem ter nenhuma informa¸c˜c˜ao a respeito do formato dos dados ali guardados.ao a respeito do formato dos dados ali guardados. Um p

Um ponteiro deonteiro deste ste tipo tipo ´´e e declarado declarado comocomo

1

1 void void *pont*ponteiroeiro

Embora p

Embora possa parecossa parecer estraner estranho a ho a primeira vista, primeira vista, ele ´ele ´e um e um velho conhecidovelho conhecido de qualquer programador C. A fun¸

de qualquer programador C. A fun¸c˜c˜aoao malloc malloc ´ ´e e umuma a fufun¸n¸c˜c˜ao que retorna mera-ao que retorna mera-mente um endere¸

mente um endere¸co de mem´co de mem´oria. oria. O O inin´´ıcio ıcio de de um um blobloco co contcont´´ıguo ıguo de de mem´mem´oria,oria, n˜

n˜ao formatado, que foi reservado para a fun¸ao formatado, que foi reservado para a fun¸c˜c˜ao que a chamou.ao que a chamou. ´´

E

E s´s´o lembrar que a fun¸o lembrar que a fun¸c˜c˜aoao   malloc  malloc, recebe como ´, recebe como ´uniunico co arguargumenmento to umum n´

n´umumero inero inteiteiro. ro. O fato de, freO fato de, freq¨q¨uentemente, usarmos a fun¸uentemente, usarmos a fun¸c˜c˜aoao   sizeof   sizeof   para  para determinar este n´

determinar este n´umero n˜umero n˜ao altera o fato de que a fun¸ao altera o fato de que a fun¸c˜c˜aoao malloc malloc n˜n˜ao recebeao recebe nenhuma informa¸

nenhuma informa¸c˜c˜ao a respeito dos dados que ser˜ao a respeito dos dados que ser˜ao armazenados l´ao armazenados l´a.a. Outro esclarecimento que se faz necess´

Outro esclarecimento que se faz necess´ario ´ario ´e e que que em em C, C, o o nome de nome de umauma fun¸

fun¸c˜c˜ao representa o endere¸ao representa o endere¸co de mem´co de mem´oria, dentro da ´oria, dentro da ´area de texto, no qualarea de texto, no qual o

o c´c´odigo execut´odigo execut´avel referente a ela est´avel referente a ela est´a localizado.a localizado.

Assim, a thread pode receber o ponteiro para sua ´

Assim, a thread pode receber o ponteiro para sua ´area area de de texto texto (que (que ´´ee um subconjunto da ´

um subconjunto da ´area de texto do programa) a partir do nome da fun¸area de texto do programa) a partir do nome da fun¸c˜c˜ao.ao. Em sistemas operacionais modernos, nem todo o c´

Em sistemas operacionais modernos, nem todo o c´odigo execut´odigo execut´avavel el ´´e e cacar- r-regado de uma vez na ´

regado de uma vez na ´area de texto, no entanto o sistema se encarrega destesarea de texto, no entanto o sistema se encarrega destes detalhes e fornece um endere¸

detalhes e fornece um endere¸camentcamento o que que ´´e e v´v´alido para fins de uso do pro-alido para fins de uso do pro-grama.

grama.

(10)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(11)

3

3

O que

O que s˜

ao PT

ao PThread

hreads?

s?

Pthreads

Pthreads ´´e e um um apelido apelido parapara Posix  Posix  Threads. Threads.  Posix   Posix ,, Portable Operating Sys- Portable Operating Sys-tem, Interface for Unix 

tem, Interface for Unix , , ´´e e um um papadrdr˜˜ao, definido pela IEEE (Institute of Elec-ao, definido pela IEEE (Institute of Elec-trical and Electronics Engineers) e pela ISO (International Organization for trical and Electronics Engineers) e pela ISO (International Organization for Standartization), como o pr´

Standartization), como o pr´oprio oprio nome nome diz ´diz ´e ue um pm padr˜adr˜ao que ao que defindefine como, noe como, no mundo do

mundo do *nix os *nix os programas deveprogramas devem m ser interfaceadser interfaceados, visando pos, visando portabiliortabilidade.dade. Ocorre que inicialmente, cada fabricante de hardware tinha seu pr´ Ocorre que inicialmente, cada fabricante de hardware tinha seu pr´opriooprio padr˜

padr˜ao de threads, o que fazia com que programas multithreaded (ou seja,ao de threads, o que fazia com que programas multithreaded (ou seja, programas usando threads) fossem muito pouco p

programas usando threads) fossem muito pouco p ort´ort´aveis de plataforma paraaveis de plataforma para plataforma.

plataforma.

4

4 C

Cri

rian

ando

do PT

PThr

hrea

eads

ds

Fazer uma chamada a uma pthread n˜

Fazer uma chamada a uma pthread n˜ao ao ´´e e muito dmuito diferente iferente de de fazer fazer uma uma cha- cha-mada a uma fun¸

mada a uma fun¸c˜c˜ao. ao. De fato, um De fato, um progprograma “Helrama “Hello Wlo Worldorld””33

pode ser feito pode ser feito da seguinte maneira.

da seguinte maneira.

hellosequencial.c hellosequencial.c 1

1 #include #include <stdio.h><stdio.h> 2

2 3

3 void void hellohello(){(){ 4

4 printf("Hello printf("Hello World\n");World\n"); 5

5 }} 6 6 7

7 int int mainmain(){(){ 8 8    hello();hello(); 9 9 }} hellothreaded.c hellothreaded.c 1

1 #include #include <stdio.h><stdio.h> 2

2 #include #include <pthread.h><pthread.h> 3

3 4

4 void void *hell*hello(){o(){ 5

5 printf("Hello printf("Hello World\n");World\n"); 6

6 }} 7 7 8

8 int int mainmain(){(){ 9

9 pthrepthread_t ad_t id;id;

3 3

Como (quase)

Como (quase) todo todo mundo sabe, mundo sabe, um “Hello um “Hello WWorld” ´orld” ´e um e um programa (normalmente oprograma (normalmente o prime

primeiro programa feito iro programa feito dendentro de tro de um um paradparadigma)igma), , e e tudo o tudo o que ele que ele faz ´faz ´e e dizer “Hellodizer “Hello World” com pequenas varia¸

World” com pequenas varia¸c˜c˜oesoes

(12)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(13)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

10

10 pthpthrearead_cd_creareate(te(&id &id , , NULNULL L , , helhello lo , , NULNULL);L); 11

11 12 12 }}

Para compilar

Para compilar e execue executar este tar este programa programa com o com o gcc, vocˆgcc, vocˆe deve foe deve fornecer rnecer osos comandos

comandos

gcc

gcc hellhellothreothread.c ad.c -o -o hellohellothreathread d -lpt-lpthreadhread ./hellothread

./hellothread

Os quatro parˆ

Os quatro parˆametros para a fun¸ametros para a fun¸c˜c˜aoao pthread create pthread create s˜s˜ao:ao: 1. o endere¸

1. o endere¸co do identificador da thread;co do identificador da thread; 2. o endere¸

2. o endere¸co dos atributos;co dos atributos; 3.

3. o eo endendere¸re¸co do c´co do c´odigo a odigo a executar executar (passado, (passado, como vimos, como vimos, atrav´atrav´es do es do nomenome da fun¸

da fun¸c˜c˜ao);ao); 4. o endere¸

4. o endere¸co da estrutura de argumentos.co da estrutura de argumentos.

No entanto, apenas o primeiro e terceiro argumentos s˜

No entanto, apenas o primeiro e terceiro argumentos s˜ao obrigat´ao obrigat´ororioios. s. OO primeiro, porque a fun¸

primeiro, porque a fun¸c˜c˜ao vai tentar escrever nele, casoao vai tentar escrever nele, caso NULL NULL seja passado, seja passado, haver´

haver´a um acesso inv´a um acesso inv´alido de mem´alido de mem´oriaoria. . O terceirO terceiro, porque ela tentaro, porque ela tentar´´a exe-a exe-cutar o c´

cutar o c´odigo no endere¸odigo no endere¸co pasco passasadodo. . Se o endeSe o enderere¸¸co for inv´co for inv´alido o mesmoalido o mesmo problema ocorrer´

problema ocorrer´a.a. ´´

E importante lev

E importante levar em ar em conta que a conta que a fun¸fun¸c˜c˜aoao pthrea pthread d createcreate retorna um valor retorna um valor inte

inteiro iro que que ´´e e o o c´c´odigo de erro encontrado na cria¸odigo de erro encontrado na cria¸c˜c˜ao da thread, ou zero, casoao da thread, ou zero, caso contr´

contr´ario.ario. T

Tamb´amb´em em ´´e e impoimportante rtante levar levar em em conta conta que que as as threthreads ads s´s´o o existem enquanexistem enquantoto a thread principal existir, a menos que a fun¸

a thread principal existir, a menos que a fun¸c˜c˜aoao pthread exit pthread exit seja usada. Esta seja usada. Esta fun¸

fun¸c˜c˜ao leva um ao leva um argumento que ´argumento que ´e um e um ponteiro ponteiro para o para o valor de status valor de status da threda thread.ad. Convenciona-se que um processo que finalizou sua execu¸

Convenciona-se que um processo que finalizou sua execu¸c˜c˜ao ao adequadaadequadamentemente deve retornar 0, enquanto que quando um erro ocorre, um valor diferente de deve retornar 0, enquanto que quando um erro ocorre, um valor diferente de

(14)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(15)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime. 6 6    pthread_exit(NULL);pthread_exit(NULL); 7 7 }} 8 8 9

9 int int mainmain(){(){ 10

10 pthrepthread_t ad_t id;id; 11

11 int int statstatus;us; 12

12 stastatus tus = = pthpthrearead_cd_creareate(te(&id &id , , NULNULL L , , helhello lo , , NULNULL);L); 13 13    if(status!=0)if(status!=0) 14 14    exit(-1);exit(-1); 15 15    pthread_exit(NULL);pthread_exit(NULL); 16 16 }}

5

5 P

Pas

assa

sand

ndo Ar

o Argu

gume

men

nto

tos pa

s para P

ra PTh

Thre

read

adss

Podemos fazer uma varia¸

Podemos fazer uma varia¸c˜c˜ao do “Hello World” com um la¸ao do “Hello World” com um la¸co que execute umco que execute um n´

n´umero arbitr´umero arbitr´ario de threads, neste caso seria mais interessante que cadaario de threads, neste caso seria mais interessante que cada thread imprimisse algo como: “Eu sou a thread i de n”

thread imprimisse algo como: “Eu sou a thread i de n” Note que para saber o valor de

Note que para saber o valor de n n ´ ´e e mumuitito o f´f´acil, basta a vari´acil, basta a vari´avel ser global,avel ser global,  j´

 j´a o mesmo n˜a o mesmo n˜ao pode ser feito com a vari´ao pode ser feito com a vari´avelavel i i porque ela est´ porque ela est´a constantementea constantemente sendo alterada pela thread executando o

sendo alterada pela thread executando o main main. Assim quando uma determi-. Assim quando uma determi-nada thread for criada, digamos com

nada thread for criada, digamos com ii = 3, ela pode n˜ = 3, ela pode n˜ao ler imediatamenteao ler imediatamente

o valor de

o valor de i, mas i, mas fazˆfazˆe-lo um e-lo um pouco pouco mais tamais tarde quarde quando ondo o main main j´ j´a a alterou. Oa a alterou. O

ii deve ser passado como parˆ deve ser passado como parˆametro.ametro.

Para fazer isto, basta passar para a thread o endere¸

Para fazer isto, basta passar para a thread o endere¸co do local onde oco do local onde o valor de

valor de ii foi armazenado, para tal, deve existir um local de armazenamento foi armazenado, para tal, deve existir um local de armazenamento

para estes valores onde eles n˜

para estes valores onde eles n˜ao mudao mudemem. . ComComo o por exempor exemplplo o um vetum vetor deor de argumentos.

argumentos. Onde Onde cada cada argumento ´argumento ´e e um um struct.struct.

argumentos.c argumentos.c 1 1   #include<stdio.h>  #include<stdio.h> 2 2   #include<pthread.h>  #include<pthread.h> 3

3 #defi#define MAXne MAX_THR_THREADS 1EADS 10000 4

4 5

(16)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(17)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

14 14 15

15 prprinintftf("("Eu Eu sosou u a a ththreread ad %d %d de de %d%d\n\n", ", i, i, n)n);; 16 16    pthread_exit(NULL);pthread_exit(NULL); 17 17 }} 18 18 19

19 int int mainmain(){(){ 20

20 inint t i;i; 21

21 ARGS ARGS args[MAX_THREADSargs[MAX_THREADS];]; 22

22 int int statstatus;us; 23

23 pthread_t pthread_t id[MAX_THREADS];id[MAX_THREADS]; 24

24 25

25 printprintf("Quf("Quantas antas ThreaThreads? ds? ");"); 26

26    scanf("%d",&n);scanf("%d",&n); 27

27 fofor(r(i=i=0 0 ; ; i<i<n n ; ; i+i++)+){{ 28

28 argargs[is[i].i ].i = = i;i; 29

29 status = status = pthread_create(pthread_create(&id[i],NULL,&id[i],NULL, 30

30 hello,(void hello,(void *)&args[i]);*)&args[i]); 31 31    if(status)if(status) 32 32    exit(-1);exit(-1); 33 33 }} 34 34    pthread_exit(NULL);pthread_exit(NULL); 35 35 }}

Note a necessidade de se fazer

Note a necessidade de se fazer typecasting  typecasting  nas linhas 13 e 30. Na linha 30 nas linhas 13 e 30. Na linha 30 a fun¸

a fun¸c˜c˜aoao pthread create pthread create recebe um recebe um void* void* por isso o formato deve ser jogado por isso o formato deve ser jogado fora. Na linha 13 o formato da struct

fora. Na linha 13 o formato da struct ARGS ARGS deve ser recuperado para poder deve ser recuperado para poder acessar a vari´

acessar a vari´avelavel i i  a partir do endere¸ a partir do endere¸co de mem´co de mem´oria fornecido.oria fornecido.

6

6 Ju

Jun

nta

tand

ndo e c

o e con

ontr

trol

olan

ando P

do PTh

Thre

read

adss

Nem

Nem semsempre pre ´´e e inintereteressassante nte que que cada cada threthread ad sigsiga a o o seu seu camicaminho nho indindepen- epen-dentem

dentemente at´ente at´e e o o fim. fim. Muitas vezes os Muitas vezes os resultadresultados obtidos os obtidos por por cada threadcada thread precisam ser juntados para fazer processamento seq¨

precisam ser juntados para fazer processamento seq¨uencial, para outra ro-uencial, para outra ro-dada de processamento paralelo ou meramente para imprimir os resultados dada de processamento paralelo ou meramente para imprimir os resultados

(18)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(19)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

mente a

mente a pthread create pthread create retorna um valor zero se a thread foi adequadamente retorna um valor zero se a thread foi adequadamente  juntada

 juntada44

e um valor diferente de zero caso tenha ocorrido um erro. e um valor diferente de zero caso tenha ocorrido um erro. No seguinte exemplo, colocamos em execu¸

No seguinte exemplo, colocamos em execu¸c˜c˜aoao N THREADS N THREADS threads. Cada threads. Cada uma vai somar

uma vai somar NN n´n´umeros aleat´umeros aleat´orios entre 0 eorios entre 0 e MAXMAX. A thread principal,. A thread principal, v

vai ai aguaguardardar ar os os resresulultadtados os parparciciaiais, s, sosomar mar enentre tre si si e e exiexibibir r o o resresulultadtado.o. Cada thread vai guardar o seu resultado parcial em uma posi¸

Cada thread vai guardar o seu resultado parcial em uma posi¸c˜c˜ao do vetorao do vetor soma parcial[N THREADS]

soma parcial[N THREADS]..

somaaleat.c somaaleat.c 1

1 #include #include <stdio.h><stdio.h> 2

2 #include #include <stdlibh><stdlibh> 3

3 #include #include <pthread.h><pthread.h> 4

4 #defi#define N_ne N_THREATHREADS 10DS 10 5

5 #de#definfine N 100e N 100000000 6

6 #de#definfine MAe MAX 10X 10 7

7 8

8 typedtypedef stef struct ruct _ARGS_ARGS{{ 9

9 int int id;id; 10

10   }ARGS;  }ARGS; 11

11 12

12 int int soma_parcial[Nsoma_parcial[N_THREADS];_THREADS]; 13

13 14

14 void *revoid *realizaaliza_soma_soma(void *p(void *p){){ 15

15 int int resuresultadoltado=0, =0, i;i; 16

16 int int meumeu_id _id = = ((A((ARGS RGS *)p*)p)->)->id;id; 17

17 18

18 /* /* sosoma ma N N nunumemeroros s alaleaeatotoririos os enentrtre e 0 0 e e MAMAX X */*/ 19

19 fofor(r(i=i=0 0 ; ; i<i<N N ; ; i+i++)+) 20

20 resulresultado tado += += rand(rand()%MAX)%MAX;; 21

21 22

22 /* /* armarmazeazena na a a somsoma a parparciacial l */*/ 23

23 soma_soma_parciparcial[meal[meu_id] u_id] = = resulresultadotado;; 24

24 25

25 pthread_exit((vpthread_exit((void oid *)0);*)0); 26

26 }} 27 27 28

(20)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(21)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

34

34 printf("\nCrianprintf("\nCriando do threads:");threads:"); 35

35 forfor(i=(i=0 0 ; ; i< i< N_TN_THREHREADS ADS ; ; i++i++){){ 36

36 argargs[is[i].i].id d = = i;i; 37

37 rc rc = = pthrepthread_crad_create(eate(&id[&id[i], i], NULLNULL,, 38

38 realiza_soma, &args[i]);realiza_soma, &args[i]); 39

39 if if (rc(rc){){ 40

40 printf("\nprintf("\nErro Erro %d %d na na cria¸cria¸c~c~ao\n",rc);ao\n",rc); 41

41    exit(-1);exit(-1); 42

42 }}

43

43 printf(" printf(" [%d]",i);[%d]",i); 44

44 }}

45 45 46

46 /* /* jujuntnta a cacada da umuma a dadas s ththrereadads s */*/ 47

47 printf("\nJuntaprintf("\nJuntando ndo threads:");threads:"); 48

48 forfor(i=(i=0 0 ; ; i< i< N_TN_THREHREADS ADS ; ; i++i++){){ 49

49 rc rc = = pthrepthread_joad_join(idin(id[i],[i],(void (void **)&**)&statustatus);s); 50

50 if if (rc(rc){){ 51

51 printf("\nprintf("\nErro Erro %d %d na na jun¸jun¸c~c~ao\n",rc);ao\n",rc); 52

52    exit(-1);exit(-1); 53

53 }}

54

54 printf(" printf(" [%d->%d]",i,st[%d->%d]",i,status);atus); 55

55 }}

56 56 57

57 /* /* coconcnclului i a a sosoma ma */*/ 58

58 printf("\nSomanprintf("\nSomando do parcelas:");parcelas:"); 59

59 forfor(i=(i=0 0 ; ; i< i< N_TN_THREHREADS ADS ; ; i++i++){){ 60

60 printf(" printf(" [%d]", [%d]", soma_parcial[i]soma_parcial[i]);); 61

61 somatsomatotal otal += += soma_soma_parciparcial[i]al[i];; 62

62 }}

63 63 64

64 /* /* impimprimrime e o o resresultultado ado */*/ 65

65 printf("\nSoma printf("\nSoma total: total: %d\n",somatotal%d\n",somatotal);); 66 66 67 67    pthread_exit(NULL);pthread_exit(NULL); 68 68 }} O objetivo do la¸

(22)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(23)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

thread mais complexa poderia retornar valores diferentes testados pelo main thread mais complexa poderia retornar valores diferentes testados pelo main para

para exibiexibir r mensagenmensagens s de de erro erro ou ou outras atitudes outras atitudes a a crit´crit´erio do erio do programaprogramador.dor. No e

No entanto, ntanto, nem nem semprsempre ´e ´e pe possoss´´ıvel juntıvel juntar tar threahreads. ds. O segO segundo undo argumargumentoento passado para

passado para pthread create pthread create ´ ´e ue um atm atributributo quo que pe pode ode serser joinable joinable ou ou detached detached.. Para que uma thread possa ser juntada ela tem que ser do tipo

Para que uma thread possa ser juntada ela tem que ser do tipo joinable joinable, , qquue e ´´ee o default do Posix. Mas, cuidado, isso n˜

o default do Posix. Mas, cuidado, isso n˜ao garante que toda implementa¸ao garante que toda implementa¸c˜c˜aoao siga essa orienta¸

siga essa orienta¸c˜c˜ao. ao. Asim, ´Asim, ´e see sempre mpre uma buma boa id´oa id´eia eeia explicitxplicitar quar que ume uma tha threadread ´´e e joijoinabnable, le, quaquando ndo ististo ´o ´e e desdesej´ej´avavel. el. Isto faIsto faz o z o c´c´odigo mais port´odigo mais port´avel e menosavel e menos propenso a ter problemas.

propenso a ter problemas. Para

Para fazer fazer isto isto ´´e e necess´necess´ario criar uma vari´ario criar uma vari´avel do tipoavel do tipo  pthread attr t pthread attr t,, inicializ´

inicializ´a-la com a fun¸a-la com a fun¸c˜c˜aoao  pthread attr init pthread attr init  e  e fazˆfazˆe-la joinable-la joinable e com com a a fun¸fun¸c˜c˜aoao pthrea

pthread d attr attr setdetasetdetachstatchstatee. . FinFinalmalmenente esta vte esta variari´´avel de atributo pode seravel de atributo pode ser passada como parˆ

passada como parˆametro para a fun¸ametro para a fun¸c˜c˜aoao  pthread create pthread create. . O seO seguguininte cte c´´odigoodigo intercalado adequadamente no programa

intercalado adequadamente no programa somaaleat.c somaaleat.c faria o servi¸ faria o servi¸co.co.

1

1 pthread_attr_t pthread_attr_t atributo;atributo; 2

2   pthread_attr_init(&atributo);  pthread_attr_init(&atributo); 3

3 pthread_attr_septhread_attr_setdetachstate(&attdetachstate(&attr, PTHREAD_CRtr, PTHREAD_CREATE_JOINABLE);EATE_JOINABLE); 4

4 pthread_create(pthread_create(&id[i], atribu&id[i], atributo, realiza_sto, realiza_soma, &args[i])oma, &args[i]);;

Quando

Quando uma uma thread ´thread ´e e joinabljoinable, e, isto isto signifisignifica ca que que ap´ap´os sua execu¸c˜os sua execu¸c˜ao ao aa mem´

mem´oria ocupada por ela n˜oria ocupada por ela n˜ao ao ´´e e libeliberada rada de de imediaimediato, to, isto isto ´´e e feito feito ap´ap´os o join,os o join, quando a thread principal j´

(24)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(25)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

7

7 O

O u

usso

o d

de

e

 mutex 

 mutex 

No programa

No programa   somaaleat.c  somaaleat.c   cada thread escrevia em uma posi¸  cada thread escrevia em uma posi¸c˜c˜ao ao diferendiferentete do vetor

do vetor  soma parcial  soma parcial, por isso n˜, por isso n˜ao ao havihavia a problemproblemas as de de concorrconcorrˆˆencia, encia, masmas imagine o caso onde mais de uma thread precisa acessar a mesma vari´ imagine o caso onde mais de uma thread precisa acessar a mesma vari´avel.avel.

Ler a mesma vari´

Ler a mesma vari´avel n˜avel n˜ao tem problema, mas quando desejamos alter´ao tem problema, mas quando desejamos alter´a- a-la, precisamos levar em conta que isto pode requerer (e normalmente requer) la, precisamos levar em conta que isto pode requerer (e normalmente requer) mais de uma instru¸

mais de uma instru¸c˜c˜ao de m´ao de m´aquina. Vamos assumir, por exemplo, que sejamaquina. Vamos assumir, por exemplo, que sejam necess´

necess´arios os seguintes passos para alterar uma vari´arios os seguintes passos para alterar uma vari´avel:avel: 1.

1. Ler o valLer o valor da varor da vari´i´avel,avel, 2.

2. Alterar o vAlterar o valor da valor da vari´ari´avel localmente,avel localmente, 3.

3. Recolocar o vaRecolocar o valor da valor da vari´ri´avel.avel.

Em um sistema preemptivo, como a maioria dos sistemas modernos, um Em um sistema preemptivo, como a maioria dos sistemas modernos, um processo

processo pode pode perder perder o o processador a processador a qualqqualquer uer momenmomento to sem sem pr´pr´evio aviso,evio aviso, portanto, se duas threads est˜

portanto, se duas threads est˜ao tentando alterar a mesma varao tentando alterar a mesma vari´i´avel pode ocor-avel pode ocor-rer a interrup¸

rer a interrup¸c˜c˜ao ao da da primeira, primeira, gerando gerando inconsistˆinconsistˆencia encia de de dados.dados. Por exemplo, imagine que uma vari´

Por exemplo, imagine que uma vari´avelavel xx  compartilhada,  compartilhada, iniciainicialmenlmentete valendo 0 v´

valendo 0 v´a ser alterada por duas threadsa ser alterada por duas threads AA ee BB, que guardam localmente, que guardam localmente o valor de x em vari´

o valor de x em vari´aveis locaisaveis locais aa ee bb, , resperespectictivvamenamente. te. PodePoderia ocorrer oria ocorrer o seguinte.

(26)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(27)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

vari´

vari´avel mutex como parˆavel mutex como parˆametrametro, o, ´´e e chamadachamada, , o o valor valor do do mutex mutex ´´e e verificaverificado do ee uma

uma de de duas duas atitudes atitudes ´´e e tomada:tomada: 1. se o mutex est´

1. se o mutex est´a destravado, ent˜a destravado, ent˜ao trava ele e continua a execu¸ao trava ele e continua a execu¸c˜c˜ao;ao; 2. se o mutex est´

2. se o mutex est´a travado, espera ele mudar de estado, trava e continuaa travado, espera ele mudar de estado, trava e continua e execu¸

e execu¸c˜c˜ao.ao.

Assim se mais de um processo deve acessar a mesma vari´

Assim se mais de um processo deve acessar a mesma vari´avel, podemosavel, podemos proteger a parte do c´

proteger a parte do c´odigo que n˜odigo que n˜ao deve ser executada simultaneamente,ao deve ser executada simultaneamente, chamada de

chamada de  regi˜   regi˜ ao ao cr´cr´ıtıtica ica , , cocom m um mutum mutexex. . AsAssisim, o m, o priprimemeiriro o procprocessesso o aa alcan¸

alcan¸car o mutex trava ele, e os seguintes, ao atingirem a regi˜car o mutex trava ele, e os seguintes, ao atingirem a regi˜ao ao cr´cr´ıtıticica a s˜s˜aoao mantidos em espera pela fun¸

mantidos em espera pela fun¸c˜c˜aoao pthread mutex lock pthread mutex lock at´ at´e e que que o valo valor or do do mutemutexx mude.

mude. Isto s´

Isto s´o vai ocorrer quando, ao sair da regi˜o vai ocorrer quando, ao sair da regi˜ao ao crcr´´ıtica, ıtica, a a tread tread que que obteve obteve oo mutex chamar a fun¸

mutex chamar a fun¸c˜c˜aoao pthread mutex unlock pthread mutex unlock, que se encarrega de destravar, que se encarrega de destravar o mutex. Apenas a thread que possui o lock pode destrav´

o mutex. Apenas a thread que possui o lock pode destrav´a-lo.a-lo. Em seguida, o primeiro processo escalonado ap´

Em seguida, o primeiro processo escalonado ap´os o destravamento, travaos o destravamento, trava o mutex e entra na se¸

o mutex e entra na se¸c˜c˜ao ao crcr´´ıtica, maıtica, mantendo os ntendo os outros outros processos processos em eem espera.spera. An

Antes de tes de seser r ususadoado, , o o mumutex devtex deve e seser r ininiciciaialilizadzado, o, isisto to pode pode seser r feifeitoto estatica

estaticamentemente, , durantdurante e a a declara¸declara¸c˜c˜ao da vari´ao da vari´avel, avel, atrav´atrav´es es de de um um comandocomando como

como

1

(28)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(29)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Out

Outra ra coicoisa sa quque e pode, pode, em em um um prprimimeieiro ro momomementnto, o, paspassasar r pelpela a nosnossasa cabe¸

cabe¸ca, ca, ´´e e que que as as threads pthreads podem odem serser  detached   detached , , j´j´a que cada uma vai se en-a que cada uma vai se en-carregar

carregar de de somar somar sua sua parcela parcela ao ao total. total. Isto ´Isto ´e e verdade, verdade, mas mas conv´conv´em em n˜n˜ao seao se esquecer

esquecer que eque em geram geral vamos querer l vamos querer que aque algu´lgu´em imprima em imprima o resuo resultado.ltado.

Claro que podemos criar uma estrutura para que cada thread descubra Claro que podemos criar uma estrutura para que cada thread descubra se

se ´´e e a a ´´ultima e, caso seja, se encarregue de imprimir o resultado, mas talultima e, caso seja, se encarregue de imprimir o resultado, mas tal cria¸

cria¸c˜c˜ao ao ´´e e uma uma comcomplicplica¸a¸c˜c˜ao do c´ao do c´odigo e desnecess´odigo e desnecess´aria dentro do escopo destearia dentro do escopo deste texto.

texto.

O seguinte programa implementa as modifica¸

O seguinte programa implementa as modifica¸c˜c˜oes discutidas, note queoes discutidas, note que este

este programa programa implementa implementa tamb´tamb´em em a a declara¸declara¸c˜c˜ao ao explexpl´´ıcita ıcita das das threthreads ads comocomo  joinable.

 joinable. Fica Fica a a cargo cargo do do leitor leitor implemetar implemetar a a vers˜vers˜aoao detachable  detachable , caso deseje., caso deseje.

somamutex.c somamutex.c 1

1 #defi#define N_ne N_THREATHREADS 10DS 10 2

2 #de#definfine N 100e N 100000000 3

3 #de#definfine MAe MAX 10X 10 4

4 5

5 typedtypedef stef struct ruct _ARGS_ARGS{{ 6

6 int int id;id; 7

7   }ARGS;  }ARGS; 8

8 9

9 pthread_mutex_t pthread_mutex_t meu_mutex = meu_mutex = PTHREAD_MUTEX_PTHREAD_MUTEX_INITIALIZER;;INITIALIZER;; 10

10 int int somasomatotaltotal=0;=0; 11

11 12

12 void *revoid *realizaaliza_soma_soma(void *p(void *p){){ 13

(30)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(31)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

32

32 pthread_attr_t pthread_attr_t atributo;atributo; 33

33 ARGS ARGS args[N_THREADS];args[N_THREADS]; 34

34 35

35 /* /* inicinicializializando ando atriatributo buto */*/ 36

36    pthread_attr_init(&atributo);pthread_attr_init(&atributo); 37

37 pthread_attr_septhread_attr_setdetachstate(&attdetachstate(&atributo, ributo, PTHREAD_CREATE_JOPTHREAD_CREATE_JOINABLE);INABLE); 38

38 39

39 /* /* crcria ia cacada da umuma a dadas s ththrereadads s */*/ 40

40 printf("\nCrianprintf("\nCriando do threads:");threads:"); 41

41 forfor(i=(i=0 0 ; ; i< i< N_TN_THREHREADS ADS ; ; i++i++){){ 42

42 argargs[is[i].i].id d = = i;i; 43

43 rc rc = = pthrepthread_crad_create(eate(&id[&id[i], i], &atr&atributoibuto,, 44

44 realiza_soma, realiza_soma, &args[i]);&args[i]); 45

45 if if (rc(rc){){ 46

46 printf("\nprintf("\nErro Erro %d %d na na cria¸cria¸c~c~ao\n",rc);ao\n",rc); 47

47    exit(-1);exit(-1); 48

48 }}

49

49 printf(" printf(" [%d]",i);[%d]",i); 50

50 }}

51 51 52

52 /* /* jujuntnta a cacada da umuma a dadas s ththrereadads s */*/ 53

53 printf("\nJuntaprintf("\nJuntando ndo threads...");threads..."); 54

54 forfor(i=(i=0 0 ; ; i< i< N_TN_THREHREADS ADS ; ; i++i++){){ 55

55 rc rc = = pthrepthread_joad_join(idin(id[i],[i],(void (void **)&**)&statustatus);s); 56

56 if if (rc(rc){){ 57

57 printf("\nprintf("\nErro Erro %d %d na na jun¸jun¸c~c~ao\n",rc);ao\n",rc); 58

(32)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

(33)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

de fazer a chamada a

de fazer a chamada a pthread mutex lock pthread mutex lock. . MaiMais que isso, uma simpls que isso, uma simples veries veri--fica¸

fica¸c˜c˜ao n˜ao n˜ao ao ´´e e suficiente, suficiente, mas mas uma uma verifica¸verifica¸c˜ao peri´c˜ao peri´odica odica at´at´e e que que a a condi¸condi¸c˜c˜aoao seja

seja satisfsatisfeita.eita.

Chamamos este tipo de constru¸

Chamamos este tipo de constru¸c˜c˜ao deao de  Busy Waiting   Busy Waiting  e, como o pr´ e, como o pr´opriooprio nome

nome diz, diz, mant´mant´em em o o processo processo ocupado ocupado fazendo fazendo nada. nada. Isto ´Isto ´e e ruim pruim pois cois con- on-some

some recursos recursos computacionais computacionais sem sem trazer trazer nenhum bnenhum benefenef´´ıcio.ıcio. ´´

E

E para para evitar evitar este este desperddesperd´´ıcio ıcio que que s˜s˜ao definidas as vari´ao definidas as vari´aveis de condi¸aveis de condi¸c˜c˜ao.ao. Uma vari´

Uma vari´avel de condi¸avel de condi¸c˜c˜ao ´ao ´e e equivequivalentalente e a a um um recurso precurso pelo elo qual o qual o processoprocesso espera e entra em uma fila, como uma fila do spooler de impress˜

espera e entra em uma fila, como uma fila do spooler de impress˜ao ou similar.ao ou similar. Para entrar nesta fila, o processo faz uma chamada

Para entrar nesta fila, o processo faz uma chamada wait wait  sobre a vari´  sobre a vari´avel eavel e fica esperando sua vez.

fica esperando sua vez.

Em contrapartida, uma outra thread sabe que a primeira thread est´ Em contrapartida, uma outra thread sabe que a primeira thread est´a, oua, ou pode estar esperando por este recurso, ent˜

pode estar esperando por este recurso, ent˜ao, quando considera a condi¸ao, quando considera a condi¸c˜c˜aoao satisfeita faz uma chamada

(34)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

cr

cr´´ıtica ıtica para para verificar verificar sua sua condi¸condi¸c˜c˜ao, ao, o o que ´que ´e e feifeito to chchamaamando ndo a a fun¸fun¸c˜c˜aoao   pth-  pth-read cond wait

read cond wait. Esta fun¸. Esta fun¸c˜c˜ao ao realizrealiza a trˆtrˆes es opopera¸era¸c˜c˜oes atomicamente:oes atomicamente: 1.

1. destradestravva o mutexa o mutex 2.

2. espera, propriamespera, propriamente, ser sinalente, ser sinalizadoizado 3.

3. travtrava o mutexa o mutex Por

Por ististo ´o ´e e necnecessess´´ario que ela receba, no ario que ela receba, no seu segundo parˆseu segundo parˆametro, o endere¸coametro, o endere¸co do mutex que ela deve alterar.

do mutex que ela deve alterar.

Deste modo, olhando a certa distˆ

Deste modo, olhando a certa distˆancia, tudo se passa como um mutexancia, tudo se passa como um mutex normal.

normal. No entanto olhado No entanto olhado mais de mais de perto perto vemos que ´vemos que ´e necess´e necess´ario que o ario que o mutemutexx seja destrav

seja destravado e ado e travtravado dentro ado dentro da da espera, pespera, pois isso ´ois isso ´e e o o que pque permite que ermite que aa outra thread altere a condi¸

outra thread altere a condi¸c˜c˜ao pela qual a primeira thread est´ao pela qual a primeira thread est´a esperando.a esperando. No programa seguinte, prodcons.c, temos um caso trivial de No programa seguinte, prodcons.c, temos um caso trivial de

(35)

produtor/con-Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

24

24 void void *consumidor(){*consumidor(){ 25

25    pthread_mutex_lock(&meu_mutex);pthread_mutex_lock(&meu_mutex); 26

26 pthread_cond_wapthread_cond_wait(&minha_cond, it(&minha_cond, &meu_mutex);&meu_mutex); 27

27 printprintf("Vaf("Valor lor do do recurecurso: rso: %d\n"%d\n",recu,recurso)rso);; 28 28    pthread_mutex_unlock(&meu_mutex);pthread_mutex_unlock(&meu_mutex); 29 29 }} 30 30 31

31 int int mainmain(){(){ 32

32 pthrepthread_t ad_t prod_prod_id, id, conscons_id;_id; 33

33 34

34 /* /* iniiniciacializliza a o o gergeradoador r de de numnumeroeros s alealeatoatoriorios s */*/ 35

35    srand(time(NULL));srand(time(NULL)); 36

36 37

37 /* /* iniiniciacializliza a mutmutex ex e e concond d */*/ 38

38 pthread_mutex_ipthread_mutex_init(&meu_mutex, nit(&meu_mutex, NULL);NULL); 39

39 pthread_cond_inpthread_cond_init(&minha_cond, it(&minha_cond, NULL);NULL); 40

(36)

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

Trusted by over 1 million members

Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial

Cancel Anytime.

P

Prroodduuttoor r CCoonnssuummiiddoorr D

Doorrmme e 33s s EEnnttrra a nna a RRCC

Espera sinal, destravando RC Espera sinal, destravando RC Acorda Acorda Atualiza recurso Atualiza recurso Sinaliza Sinaliza Destrava RC Destrava RC T

Terermiminna a ReReccebebe e sisinanal, l, trtravavanando do RCRC Imprime o valor Imprime o valor Destrava RC Destrava RC Termina Termina Sugest˜

Sugest˜ao para o leitor: modifique o programa, comentando as linhas 13,ao para o leitor: modifique o programa, comentando as linhas 13, 18 e 26, eliminando o sincronismo e a espera, e execute o programa, o valor 18 e 26, eliminando o sincronismo e a espera, e execute o programa, o valor fica quase

Referências

Documentos relacionados

Conta de Desenvolvimento Energético - determina que é, também, objetivo da Conta de Desenvolvimento Energético (CDE), prover recursos para compensar descontos,

1. O Município da Batalha é a entidade titular que por atribuição assegurar a provisão do serviço de gestão de resíduos urbanos no respetivo território. Em toda a área

Chora Peito Chora Joao Bosco e Vinicius 000 / 001.. Chão De Giz Camila e

Ganhos significativos em algumas competências socioemocionais a curto prazo (relacionamento com os pares e competência social)?. Os alunos do GI com níveis médios no

 O OBSERVATÓRIO SOCIAL terá a missão de providenciar o material necessário para que os voluntários possam desenvolver suas atividades com precisão, bem como acompanhar todos os

Dentro deste mesmo conceito, outro fenômeno foi o da “Carga de Informações” (Information Load), ou seja, o reconhecimento que de além de estarem sobrecarregados de informações,

Você poderá criar listas de favoritos para organizar / facilitar o acesso aos canais disponíveis como segue:  Selecione o canal que deseja classificar e pressione a tecla ‘FAV’

Caso o número de equipas seja diferente entre os grupos, ignora-se o resultado da equipa pior classificada do grupo com a equipa a desempatar nesse grupo, para que todas as equipas