Você está na página 1de 4
1 Programagao concorrente no Linux 1.1 Threads Como apresentado em aula, a linguagem C nfo possii nenbum recurso native para permitir e programagio conconvente, Contucdo, este problema pode ser contornado utilizando-se uma bibliteca que prové a abstragio de threads, Unie pthread seria uma nova linha de execugia, ou seja, umn fangio que sera executad concorrente- Jnente com as ontras pthreads/pracessos que existirem no sistema operacional "Antes de utilizar threads, devemos fazer a incluso do arquivo onde existem as definigdes das fungoes include 1.2. Compilacio de programas concorrentes [A biblioteca pthreads precisa ser inserida ao compilar o programa fonte .« usando a opgio ~2 (library) ‘gcc meu_prograna.c ~Lpthreads -o meu_prograna 1.2.1 Cringfo das threads A cviagho de una thread necesseita de um identifcador: pthread_t id, ‘Todas as operagies sero realizadns sobre este identificador ‘A fungi para exiar ume thread é a_attr t tater, void +(+start routine) iat pthread_create(pthread.t +throad, const pthr (roid *), void *arg)s | tL i —— — 7 1 0 primiro parkmetzo a identiicngto da thread, o segundo so os atributos que poxlem ser deisudos come NUE {atributon default), 0 préximo parmetro & 0 enderego da fungho alvo que ser exteutadn € timo parsnetro x80 06 tavimottos desta fungao alvo. Percebe-se que a fungi alvo ceve ser um. fungio que retorna um ponteiro genético (void *) e tem eomo parimetro am ponteiro genérico tambérn Exemplo: pehroad_create (kid, MULL, (voSd #) minha thread NULL) ; ifginelude al#include alincinde epthread.h> | a finelude Slincade cmath.h> | pthread_t 14,142) ovoid * minhathread (void sapelido) { aol float ks hi) wndxecs) nl esa (e428) nf oy Lu) pthrendexit (MULL) ; 5) rt ty] void # minha thread 2(void tapelide) { is] whi10 (1) as| printe ("ln : aa sleep (4) 5 al > rol pehread_oxtt (WULL) 23) 2a) dol ine main(int arge, char tary) 4 wel '™* Stnreadcrente (kid, MOLL, (void +) ninba thread, WULU}; 3 Rnresdacroate (R1a2, NULL, (void 4) minke thread-2 MULL); as} wate (ds ao] veturn 0; + 1.2.2 Terminagio de uma thread ‘Um thread pode ser termminada com a fungio pthread_exit NULL) ; 0 pardmetro desta fumgao seré a valor de retorno da thread, Se a thread em questéo (como 110 exemplo) fica num loop sem fir, ela jamais terminaré e assim nfo precisa chamar pthread_exit. ‘Note ainda que quando a6 2 threads forats disparadas na fungio main existem 3 Tinbas de exeeugio. Uma pare ‘ean thvead ¢ outra da prdpria fungio main, No exemplo, a fungio wain fia num loop sem fim. Se eduele loop oro existe, a fungéo main chamaria return e terminaria 0 processo (matanco todas as threads que estivessea cexeeuttand). ani main pode ser codificzda parn ao invés de fear nom loop sem fn, aguardas o térnino de wna thread usando a fungior int pthread_join(pthread t th, void **thread_return); @ prinie parimetto 6a idautificagio da thrend e 0 segundo pardmetro & o retorno que a tal thread Fornee. Quanto nio existe interesse em verifiear 0 retorno pode-se chamar pthread_join( threadt, NOLL); 1.2.8 Passagem de parametros para threads #include Hinclude 5] #include Hl 2] tinclude F s]xaetine nomTHREADS 6 ,| vl void *PrintHello(void *threadid){ 1 ui sat eas 2 ta] waneep (10000); hil tid = (int) threadia; to] prince (Ota, ew owe Thread Zaria", t4d)s to] pehroad_oxtt (NULL): ny 13 fp] tat main Cine arge, char sargy(1)¢ sal ti] pthread_t threads (WUM_THREADS) ; nl ine rey ti FS ail for(e=0; e al > jo] whste (4) 5 3] returm 0; ail : Diseussio sobre pardimetros para threads 10 Seo parfimetro for um double ? © Se for necessirio passar mais parémetros ? 1.3. Exclusio miitua e sincronizagao de threads: Seméforos ara permitir a excluso ivitua e sneronizagio de threads num programa concorrente pode-se utilizar sennAforos Da mesina forma que threads, seméforos nio existem nativamente na Tinguagem C mas foram implementados come tama biblintora externa. Para utilizar seméforos wo Linux utiliza-se #include Lg. Cringe e inicializagio de um seméforo para inicializagio de sematoros. plo: Nas aulas teéricas de Sistemas Operacionais foi apresentads una instru Naguela momento por se tratar de tim pseudo-eédigo os seméforas foram iniciliandas diretamente, exe eonaphore mitex=t, ‘Na pratica para crinr wm seméforo, deve-se declarar: sent mutex; e para nicializaro seméforo sem init (Amu tex,0,1):., Nesta chamada 0 semétoro mutex est sendo inicalizado com o valor 1. O segundo parimelso que vale O sorve para indicat que 0 seméfora indo seré compartilhaco com todas a threads que pertencenn umn dete ‘Mined process ¢ assim o seméforo serd alocedo numna ineméria pertencente no procesto. Se o valor for diferente dde 0 sighifca que o seméforo seté compattilhado com outtos processos no sistema e precisard ger alocndo nuit meméria compartilhada por estes processos. 1.3.2. Compilagao de programas com seméforos [A biblioteca de semaforos esta junto com a biblioteca das pthreads, assim, usa-se gee main.c -Ipthreads ~ 1.5.3 Destruigéo de um seméforo Caso um seméforo nfo esteja mais em us0 0 mesmo pode ser destruido com int san_destroy sent ten); Soinente wnaforos que tenhan sido anteriormenteiniializndos podem ser destufdos pots é na operagio de iniciak suagao que n meméria necesséria para o seméforo & alocada. A rotia ce desteuigho int desalocar ests meméra 1.3.4 Operagées sobre um seméforo tnt gom_onit(oon_t + son); Utilizada para fazer um P/doun sobre um seméforo, ou seja, decrements sou valor e bloqueia se 0 valor estava ein zero. Tat sen post (went + sen) ; Uulizadn para fozer umn V/up sobre un senuforo, ou een increments © set a ae rotten Oe lg proceso/thead eslava bloqieado neste semaore entao sera Nberado poder fexecittar quando selecionado pelo escalonador ae ae reeatue aon, rson, int seval); Utllizada paca enpturar (ler) @ valor de cm semffora sem ro ‘aliznr nentuann operagio sobre ele, O valor Lido é armazenado uo segundo paramette ( nl | i a) #inclade slpanciude i) #inclade 5|#include [include s| sent Si Sine bettas hivoid # thi (void #5) rt ts] gem_vatt C&S); nul vee L0=0; 15 194 1 1s ul aa 2] al 2 2x Fe 2s ao so} 2 3 34 a ssl a y £ usieep (1000) ; it (vot [ol==0) ¢ printt ("esta vatendo 0"; > lee print£("neo cota vatendo 0*) sen.post (2S); pthread_exit (NULL) ; a 4 eh (void +5) son_vait (b8); ver (0}=15 som_post (8); main(int argc, char *argv(1) pthread_t i81, 142; vet [0]*0; eeninit (18,0,1); pehread create (bidt , MULL, tht , MULL) ; Pehread_create (bid2,NULL, th, NULL); wnite (1); return 0} 14 Exercicios: 1) Implemente 6 problema do produtor consumidor usando prograniagio concorrente e semiforos. 2) Implemente o problema dos leitores e escritores usando pro ygramagio concorrente e semaforos, 43) Implemente 0 problema do jantar dos fildsofos usando programagao concorrente ¢ semétoras.

Você também pode gostar