Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Brkić SI 29/15 Zrenjanin 2018. Softversko inženjerstvo
Sadržaj 1. Zadatak... 3 2. Zadatak... 6 3. Zadatak... 9
1. Zadatak Prvi zadatak se bavi pogađanjem nasumičnog broja iz intervala od 1 do 100.
Funkcija randomnumber je klasična funkcija za biranje nasumičnog broja u nekom intervalu. Interval se određuje pomoću donje i gornje granice koje funkcija prima kao argumente. Povratna vrednost funkcije predstavlja taj broj koji je funkcija izgenerisala. Pošto se u zadatku traži da se izmeri i vreme za koje je korisnik uspeo da pronađe izgenerisani broj, pravimo funkciju brojačsekundi. Protekle sekunde će teći sve dok se broj ne pronađe, što se vidi iz uslova u while petlji postavljenog u liniji broj 26. Promenljiva ctitle je ustvari ispis koji će se videti u naslovu konzole i tu će se prikazivati protekle sekunde u realnom vremenu (znači broj sekundi se konstantno povećava za jedan). U main funkciji se kreira nit. Parametri niti su: NULL, bez bezbednostih atributa, koristi podrazumevane 0, koristi podrazumevanu veličinu steka BrojacSekundi, naziv niti (naziv funkcije koja se pokreće kao nit) NULL, argumenti (parametri) koji se prosledjuju niti 0, korisiti podrazumevane tagove za kreiranje niti (0 - odmah pusti nit da se izvršava) &dwthreadid), vrati identifikator niti
Nakon kreiranja niti postavlja se uslov if koji znači da ukoliko se proces nije kreirao, HANLDE ce imati vrednost NULL. U do while petlji vrši se provera da li je uneti broj veći ili manji od zadatog broja. Ako je manji dobićemo poruku da je traženi broj manji, a ako je veći dobićemo poruku da je treženi broj veći. Ako pogodimo broj dobijamo obaveštenje da smo pogodili broj i za koliko vremena smo to uspeli. Još jedan bitan uslov je stavljen u while petlji na liniji 80, a to je da ako protekle sekunde dostignu broj 20 program se završava i mi dobijamo poruku da nam je vreme isteklo. Ovako izgleda program kada se pokrene:
2. Zadatak Ovaj zadatak prikazuje matrix program koji radi pomoću niti. Na samom početku pravimo strukturu, koja se naziva tparam, odnosno zvaće se param i ona predstavlja parametre jednog treda a to su kolona kojoj on pripada i head koji predstavlja početak treda (niti).
Sledeća funkcija DWORD WINAPI dothread (LPVOID lpparam) služi za kreiranje niti i kreiranju njeihovog izgleda. U njoj određujemo kolika je veličina ekrana naše konzole da bismo mogli odrediti veličinu niti. To radimo pomoću funkcije CONSOLE_SCREEN_BUFFER_INFO. U while petlji pomoću FillConsoleOutputAttribute u zavisnosti od toga na kojoj se poziciji nalazi karakter određujemo njegovu boju (tamno zelena, svetlo zelena, bela i crna). Zatim pomoću funkcije random ubacujemo karaktere u određenom opsegu. Na kraju funkcije postavljamo uslove za brisanje niti, tj. kada nit dođe do kraja konzole ona kreće da se briše, a nakon nekog vremena za njom kreće nova nit. U main funkciji određujemo koliko niti ćemo kreirati, u ovom slučaju taj broj je 40. U for petlji dodeljujemo parametrima vrednosti, svakoj niti ponaosob, tj. određujemo broj kolona i pomoću random funkcije određujemo odakle će niti počinjati (svaka nit se stvara na različitoj poziciji). Na kraju ako je pritisnut karakter a, nama se u konzoli ispisuje poruka kraj rada, i niti se stopiraju.
Nakon pokretanja program izgleda ovako:
3. Zadatak U ovom zadatku zadat je niz brojeva koji treba da se sortira. Sortiranje se vrši pomoću algoritma za sortiranje niza, a dimenzija niza određena je u promenljivoj dim koja je u ovom slučaju 5000. Na osnovu nje izračunavamo broj niti i dužinu niza. Algoritam za sortiranje je u ovom slučaju uzet kao već gotov, tako da ga nećemo posebno objašnjavati. Kroz dve for petlje se krećemo kroz niz upoređujući članove i određujići koji je veći a koji manji član. Funkcija DWORD WINAPI sortthread služi nam da sortiramo niti pomoću funkcije sortalgorithm. Ono što je novo a to je da pravimo novu promenljivu koja je ustvari pokazivač i pomoću kastovanja, određujemo njegovu veličinu. U main funkciji određujemo karakteristike procesora, tačnije processaffinitymask i systemaffinitymask i prikazujemo ih u konzoli. Određujemo koliko imamo ukupno slobodne memorije pomoću promenljive memorija koja ustvari predstavlja objekat MEMORYSTATUS gde se nalaze informacije o memoriji. U pokazivac *n pomoću memorijske alokacije smestamo njegovu veličinu i potom kreiramo niti. Uzimamo početno vreme. Pomoću funkcije WaitForMultipleObjects kreiramo višenitno sortiranje, tačnije niz delimo na više delova od kojih svaki deo pripada drugoj niti, tako da jedna nit sadrži jedan deo niza. Funkcija će čekati sve dok se svi uslovi ne ispune. Nakon toga kreira se nova nit koja sve te satavlja u jednu, naravno sortira sve te već sortirane delove niza koji su sada sastavljeni opet u jedan pomoću funkcije WaitForSingleObject. Uzima se krajnje vreme i oduzimanjem početnog od krajnjeg vremena dobijamo vreme koje je bilo potrebno za sortiranje niza i to štampamo u konzoli. Nakon toga stampa se niz koji je sortiran, odnosno svi njegovi članovi od najmanjeg ka najvećem. Na samom kraju upotrebom free(niz); mi oslobađamo memoriju koju je niz zauzeo.
Program će nakon izvršavanje izgledati ovako: