S
Su
um
m´
´
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.
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
1
1 A
Allo
oc
ca
a¸
¸
c˜
c˜
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););
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
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.
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
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 umEm 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˜
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
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
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.
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
3
O que
O que s˜
s˜
ao PT
ao PThread
hreads?
s?
PthreadsPthreads ´´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
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
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
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
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
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
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
NemNem 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
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
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
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
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¸
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
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´
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
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 programaNo 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.
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
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
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
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
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
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
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
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
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
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
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