In gara A intră simultan maximum m trenuri care vor să ajungă în gara B. Intre A şi B există simultan n linii, m > n, dar în gară se pot afla simultan doar n trenuri. Fiecare tren intră în A la un interval aleator. Dacă are linie liberă între A şi B, o ocupă şi pleacă către B, durata de timp a trecerii este una aleatoare. Să se simuleze aceste treceri. Soluiile, una folosind variabile condiţionale, cealaltă folosind semafoare, sunt prezentate în tabelul următor.
Cinci (n) filosofi sunt așezați la o masă rotundă. Fiecare filosof are în față o farfurie cu spagheti. Pentru a mânca spagheti un filosof are nevoie de două furculițe. Intre două farfurii există o furculiță (5 sau n în total). Viața unui filosof constă din perioade în care gândește și perioade când mănâncă. Când un filosof devine flămând, el încearcă să ia furculițele din stânga și din dreapta. Cănd reușește va mânca un anumit timp după care pune furculițele jos.
Dacă toți ridică simultan furculița din stânga rezultă: deadlock. Altfel, după preluarea furculiței din stânga, fiecare verifică să fie disponibilă şi cea din dreapta şi în caz negativ o pune înapoi pe cea din stânga. Dacă toți ridică furculița din stânga simultan, vor vedea furculița din dreapta indisponibilă, vor pune înapoi furculița din stânga și se reia din început: starvation
Se dă un recipient care poate să memoreze un număr limitat de n obiecte în el. Se presupune că sunt active două categorii de procese care accesează acest recipient: producători şi consumatori. Producătorii introduc obiecte în recipient iar consumatorii extrag obiecte din recipient.
Pentru ca acest mecanism să funcţioneze corect, producătorii şi consumatorii trebuie să aibă acces exclusiv la recipient. In plus, dacă un producător încearcă să acceseze un recipient plin, el trebuie să aştepte consumarea cel puţin a unui obiect. Pe de altă parte, dacă un consumator încearcă să acceseze un recipient gol, el trebuie să aştepte până când un producător introduce obiecte în el.
Pentru implementari, vom crea un Recipient având o capacitate limitată MAX. Există un număr oarecare de procese numite Producător, care depun, în ordine şi ritm aleator, numere întregi consecutive în acest recipient. Mai există un număr oarecare de procese Consumator, care extrag pe rând câte un număr dintre cele existente în recipient.
In textele sursă, tablourile p, v şi metoda / funcţia scrie, sunt folosite pentru afişarea stării recipientului la fiecare solicitare a uneia dintre get sau put. Numărul de producători şi de consumatori sunt fixaţi cu ajutorul constantelor P şi C.
In sursa unui thread producător, variabila art dă numărul elementului produs, iar i este numărul threadului. După efectuarea unei operaţii put, threadul face sleep un interval aleator de timp.
In sursa unui thread consumator, după o operaţie get, acesta intră în sleep un interval aleator de timp.Se dă o resursă la care au acces două categorii de procese: cititori şi scriitori. Regulile de acces sunt: la un moment dat resursa poate fi accesată simultan de oricâţi scriitori sau exact de un singur scriitor.
Problema este inspirată din accesul la baze de date (resursa). Procesele cititori accesează resursa numai în citire, iar scriitorii numai în scriere. Se permite ca mai mulţi cititori să citească simultan baza de date. In schimb fiecare proces scriitor trebuie să acceseze exclusiv la baza de date.
Simularea noastră se face astfel.Pentru implementari, consideram un obiect pe care Il vom numi “bază de date” (Bd), . Există un număr oarecare de procese numite Scriitor, care efectuează, în ordine şi ritm aleator, scrieri în bază. Mai există un număr oarecare de procese Cititor, care efectuează citiri din Bd.
O operaţie de scriere este efectuată asupra Bd în mod individual, fără ca alţi scriitori sau cititori să acceseze Bd în acest timp. Dacă Bd este utilizată de către alte procese, scriitorul aşteaptă până când se eliberează, după care execută scrierea. In schimb, citirea poate fi efectuată simultan de către oricâţi cititori, dacă nu se execută nici o scriere în acel timp. In cazul că asupra Bd se execută o scriere, cititorii aşteaptă până când se eliberează Bd.
Variabila cititori reţine de fiecare dată câţi cititori sunt activi la un moment dat. După cum se poate observa, instanţa curentă a lui Bd este blocată (pusă în regim de monitor) pe parcursul acţiunilor asupra variabilei cititori. Aceste acţiuni sunt efectuate numai în interiorul metodelor scrie şi citeste.
Metoda citeste incrementează (în regim monitor) numărul de cititori. Apoi, posibil concurent cu alţi cititori, îşi efectuează activitatea, care aici constă doar în afişarea stării curente. La terminarea acestei activităţi, în regim monitor decrementează şi anunţă thread-urile de aşteptare. Acestea din urmă sunt cu siguranţă numai scriitori. Metoda scrie este atomică (regim monitor), deoarece întreaga ei activitate se desfăşoară fără ca celelalte procese să acţioneze asupra Bd.
Metoda afisare are rolul de a afişa pe ieşirea standard starea de fapt la un moment dat. Situaţia la un moment dat este dată prin stările cititorilor şi ale scriitorilor. Stările fiecărui scriitor (S) sunt afişate prin câte un întreg: -3 indica scriitor nepornit, -2 indica faptul ca scriitorul a scris si urmeaza sa doarma, -1 indică aşteptare ca cititorii să-şi termine operaţiile, 0 indică scriere efectivă. In mod analog, stările fiecărui cititor (C) sunt afişate prin câte un întreg: -3 cititor nepornit, -2 a citit si urmeaza sa doarma, -1 indică aşteptarea terminării scrierilor, 0 indică citire efectivă.
Sa se scrie un program care va inmulti doua matrici de dimensiuni mari folosind un numar de n threaduri, n fiind dat ca parametru. Fiecare element al matricei rezultat va fi calculat de un anumit thread. Spre exemplu, daca matricea rezultat are 3 linii si 5 coloane iar n=4, elementul (1,1) al matricei rezultat va fi calculat de threadul 1, (1,2) de threadul 2, (1,3) de threadul 3, (1,4) de threadul 4, (1,5) de threadul 1, (2,1) de threadul 2, (2, 2) de threadul 3 etc. Programul va afisa timpul in care se calculeaza matricea rezultat. Se vor compara rezultatele obtinute ruland programul utilizand un numar diferite de threaduri (1, 2, 4, 8). Problema se va rula pentru matricii de dimensiuni mari (spre exemplu de 1000x1000) cu elemente generate aleator.
Sa se scrie un program care folosind threaduri simuleaza decolarea si aterizarea avioanelor pe un aeroport. "Din senin" apar threaduri (avioane) create de un thread daemon, avioane care trebuie sa aterizeze pe o pista unica. La crearea fiecarui thread care reprezinta un avion, se stabilieste aleator pentru acesta o cantitate de combustibil ramasa si o ora la care trebuie sa decoleze. Un thread daemon va coordona aterizarile si decolarile pe pista unica, astfel incat nici un avion aflat in aer sa nu ramana fara combustibil, iar intarzierea decolarii avioanelor de la sol sa fie minima.Se vor folosi, daca este cazul, variabile mutex si / sau variabile conditionale.
Sa se scrie un program care numara, folosind threaduri, numarul de cuvinte 'the' din mai multe fisiere date ca parametri. Programul va afisa la final timpul total de executie, timpul de executie per fisier si topul celor mai harnice trei threaduri (timp de executie / dimensiune fisier analizat). Problema va fi implementata si fara threaduri, afisandu-se de asemenea timpul de executie.
Observatii: Fisierele text date ca parametrii trebuie sa aiba o dimensiune relativ mare. Pentru o rezolvare 'cat mai placuta' a problemei se recomanda utilizarea ca versiunilor text in limba engleza a diferitor romane clasice din literatura universala disponibile la adresa: www.gutenberg.org.
Sa se scrie un program care sorteaza un sir folosind threaduri. Programul principal creeaza un thread T1 a carui sarcina este sortarea intregului sir. Acest thread, creaza la randul sau doua threaduri T2 si T3 a caror sarcina este sortarea celor doua jumatati ale sirului. Dupa ce threadurile T2 si T3 termina de sortat cele doua jumatati, threadul T1 interclaseaza jumatatile sirului pentru a obtine varianta sortata. Pentru sortarea celor doua jumatati ale sirului threadurile T2 si T3 vor aplica un mecanism similar. Programul va fi rulat pentru un sir cu cateva zeci de mii de elemente. La sfarsit va fi afisat timpul in care a fost sortat intregul sir.Se vor folosi, daca este cazul, variabile mutex si / sau variabile conditionale.
Sa se scrie un program care genereaza un labirint sub forma unei matrici de mari dimensiuni ce contine numai 0 si 1 (0 liber, 1 zid). Folosind threaduri sa se incerce rezolvarea labirintului. Pornind din centrul labirintului, un numar de unul, doua, trei sau patru threaduri (dupa caz) vor porni in fiecare directie incercand sa iasa din labirint. Cand ajunge la o intersectie, threadul curent va crea alte threaduri care vor porni pe caile accesibile din intersectie, threadul curent poate continua si el pe o cale accesibila. Se va tipari frecvent matricea labirintului, fiecare thread lasand "o urma" pe unde a trecut (spre exemplu id-ul sau). Se vor folosi, daca este cazul, variabile mutex si / sau variabile conditionale.
Sa se scrie un program care cauta, folosind n threaduri, fisierele cu o anumita extensie dintr-un anumit director si din toate subdirectoarele sale. Programul primeste ca parametru numarul n de threaduri, directorul si extensia. Primul thread "cauta" doar la primul nivel in directorul respectiv, afiseaza eventualele fisiere gasite cu extensia respectiva si pune intr-o lista FIFO toate subdirectoarele intalnite. Celelalte threaduri (ca si primul thread dupa ce termina cu directorul dat ca parametru) extrag pe rand cat un subdirector din lista si il proceseaza mai departe in aceeasi maniera. Programul se termina cand lista de directoare este vida. Se vor folosi, daca este cazul, variabile mutex si / sau variabile conditionale.
Sa se scrie un program care simuleaza o agentie de pariuri. Programul va opera cu trei tipuri de threaduri. Primul tip reprezinta thredul deamon ce reprezinta agentia de pariuri. Al doilea tip reprezinta threadurile care reprezinta meciurile dintre doua echipe pe care le ofera spre pariere agentia. Toate threadurile de al doilea tip vor rula aceeasi perioada de timp, spre exemplu 90 de secunde). Ultimul tip o reprezinta pariorii, care vor paria "live" pe rezultatele finale ale meciurilor. Threadul daemon va oferi pariorilor cote "live" de castig. Spre exemplu, daca in secunda 80 scorul este 3-0 pentru prima echipa, agentia va oferi o cota de 1.05 pentru acest rezultat final. Pariorii pot paria oricand pe acest rezultat final, insa nu isi pot modifca pariul. Rezultatele meciurilor se modifica aleator pana la final, pariorul putand castiga de 1.05 ori suma pariata sau pierde toata suma daca rezultatul se schimba, de exemplu devine 3-4. Threadurile ce reprezinta pariorii pleaca initial cu o suma pe care o detin, fiind scoase din joc daca raman fara bani. Dupa mai multe etape, se va fisa topul pariorilor in functie de castig. Se vor folosi, daca este cazul, variabile mutex si / sau variabile conditionale.