[ itf @ 11.07.2012. 19:42 ] @
Razmišljam ali nikako da osmislim nekakav pametni primjer zadatka kojeg bi postavio pred studente a da uključuje korištenje thredova tj. paralelni rad, a nakon toga i nadogradnju tog zadatka na korištenje kritične sekcije...... ideje?
[ Mihajlo Cvetanović @ 12.07.2012. 08:09 ] @
Prvi deo je kad imaš unapred sve podatke koje treba obraditi, pa se podaci podele među nitima tako da svaka nit ima otprilike istu količinu posla. Nezgodacija je što moraš za svaku nit unapred da odrediš količinu posla. Zato sledi drugi deo u kome se podaci ne raspodeljuju po nitima unapred, nego stoje na jednom mestu, a svaka nit kad postane slobodna uzme novi podatak za obradu. Za ovo konkurentno preuzimanje podataka treba ti kritična sekcija.
[ deerbeer @ 12.07.2012. 08:27 ] @
Napravi vise tredeova koji nesto citaju i upisuju u neki njima zajednicki niz .
[ Mihajlo Cvetanović @ 12.07.2012. 08:34 ] @
Cilj je da se prvo napravi jedno rešenje sa nitima koje nema kritične sekcije, a onda da se uvede promena zbog koje je neophodno uvesti i kritične sekcije.
[ Nedeljko @ 12.07.2012. 08:48 ] @
Obrada poruka iz bazena poruka, gde svaka nit uzima po jednu poruku iz bazena, uklanja je iz bazena (ovo dvoje mora biti u jednoj sekciji zaštićenoj mjuteksom), a onda je obrađuje, moguće šaljući novu poruku u pazen (ubacivanje mora biti u sekciji zaštićenoj istim tim mjuteksom bazena poruka). Dalje, treba pomoću kritičnih sekcija napraviti klasu mjuteks.

Druga varijanta je da se vađenje iz bazena poruka i stavljanje poruke u njega radi jednoj funkciji koja je zaštićena kritičnom sekcijom.
[ deerbeer @ 12.07.2012. 08:50 ] @
Ok. Ajd' ovako mozda neki primer :
1. bez kriticnih sekcija - svaki thread odradjuje neku racunsku operaciju (npr. izracunava faktorijel od random broja) i ispisuje ga na ekran ako pretpostavimo da je printf thread safe
2. sa kriticnom sekcijom - svaki thread izvrsava istu gore navedenu operaciju sa ulazom koji je rezultat prethodnog threada upisanog u niz, a rezultat smesta isto u niz koji ce procitati sledeci thread.

Za pocetak setovati vrednosti niza na neke proizvoljne non- null vrednosti a bi rezultatii imali smisla.
Moze neka druga racunska operacija data kao primer jer ce faktorijel brzo da ode u beskonacnost .

[ itf @ 12.07.2012. 08:54 ] @
Temeljna ideja je da se obrade thredovi a svakako bi bilo dobro dodati i kritičnu sekciju. Ono što bi bilo idealno jest da primjer bude vizualan pošto se radi u C++ Builderu, i to je ono što me najviše muči. Da nema kritične sekcije dao bi im da naprave npr. nekakav download manager koji iz listbox-a pokupi linkove koje treba skinuti, te za svaki link kreira poseban thread koji radi download tog linka (sadržaja). No teško mi smisliti onda gdje dodati kritičnu sekciju. Dodati ću i mutex ali to nije problem - npr. moraju napraviti da aplikacija ne smije dozvoliti višestruke instance.
[ deerbeer @ 12.07.2012. 09:04 ] @
Citat:

Da nema kritične sekcije dao bi im da naprave npr. nekakav download manager koji iz listbox-a pokupi linkove koje treba skinuti, te za svaki link kreira poseban thread koji radi download tog linka (sadržaja).
No teško mi smisliti onda gdje dodati kritičnu sekciju.

Pa nek svi donwload-uju i upisuju sadrzaj u jedan fajl. Tu ce morati da se odradi sinhronizacija .
A prvi primer bez kriticne sekcije nek svaki tred downloaduje u svoj poseban fajl .
[ itf @ 12.07.2012. 09:08 ] @
Možda ovako: Svaki thread downloada u različiti fajl ali svi threadovi zajednički updataju isti ProgressBar koji prikazuje status svih downloada.
[ X Files @ 12.07.2012. 09:13 ] @
VCL nije threadsafe. Barem nekada nije bio, ne znam sta se sada desava.

To znači da ako svaki taj download thread želi da upiše informaciju da je završio posao u neku zajedničku listu (TStringList, TListBox, i sl.) trebalo bi da imaš kritičnu sekciju za upis (Add, Insert) tog podatka. Tu možeš upotrebiti kritične sekcije.

A kada koristiš kritične sekcije, uvek je dobra ideja upariti ih s RAII-jem:
http://www.elitesecurity.org/t...esign-pattern-za-thread-safety

[ Dexic @ 12.07.2012. 09:13 ] @
Pazi samo posto VCL NIJE thread safe (osim poneke komponente ali neke nisu uopste, neke nisu skroz... neke jesu)
Nemoj im zadati zadatak gde ce im se naci neka prepreka u vidu sinhronizacije VCL-a za koji ne znaju.
[ itf @ 12.07.2012. 09:27 ] @
Da. Svakako. Nisam ja zaboravio na Synchronize pri updateanju GUI-ja. Samo sam se htio fokusirati na ovako nešto:

CRITICAL_SECTION g_cs;
InitializeCriticalSection(&g_cs);
// …
EnterCriticalSection(&g_cs); // zaključaj CS
// …
LeaveCriticalSection(&g_cs); // otključaj CS
DeleteCriticalSection(&g_cs);

To su studenti koji se službeno prvi put susreću s programiranjem aplikacija koje imaju GUI tako da nije mi u cilju mučiti ih s previše toga. Jednostavno da naprave nekakvu smislenu aplikaciju u kojoj vide konkretni rezultat i primjenu teme (u ovom slučaju threadovi).


[ Nedeljko @ 12.07.2012. 15:33 ] @
Smem li da pitam gde predaješ i kojim studentima? Je li BCB zvanični nastavni alat?
[ itf @ 12.07.2012. 22:06 ] @
Tehničko veleučilište u Zagrebu (Informatika + Računarstvo). Sve do sada je korišten Visual Studio i MFC, no s obzirom da dosadašnji nositelj predmeta godinama već nije našao vremena da osvježi gradivo i vježbe uspio sam da prođem s prijedlogom za C++ Builder.
[ Nedeljko @ 13.07.2012. 09:11 ] @
Off topic

Smem li da pitam zašto nisi progurao Qt, koji je elem besplatan, elem traženiji na tržištu?
[ itf @ 13.07.2012. 09:26 ] @
Nažalost ne smatram da imam toliko iskustva u qt-u da bi to mogao tako kvalitetno prenijeti drugima kao da je riječ o BCB-u kojeg koristim cca 10 godina. Da imamo osobu koja ima dovoljno iskustva u tome ne bi bilo nikakvih problema da se praktični dio radi qt + vcl ali ovako je meni osobno to srljanje u nešto što nisam toliko siguran.
[ Mihajlo Cvetanović @ 13.07.2012. 09:43 ] @
To je taj problem. Ako sledećih deset godina budeš gurao C++ Builder postaćeš onaj što "nije našao vremena da osvježi gradivo" :)
[ itf @ 13.07.2012. 09:45 ] @
C++ Builder i VCL se za razliku od MFC-a konstantno razvijaju tako da će svakako biti tu prostora za osvježavanje :) Npr. već sljedeće godine uvodim android i ios aplikacije čim za njih izađe podrška u sljedećem C++ Builderu XE3.
[ Dexic @ 13.07.2012. 19:35 ] @
RAD Studio XE2 vec ima podrsku za iOS.
[ itf @ 14.07.2012. 08:55 ] @
Ja govorim o C++ Builderu.
[ Dexic @ 14.07.2012. 09:39 ] @
CInilo mi se da i BCB ima iOS podrsku, posto i Delphi i BCB XE2 imaju podrsku za OSX (a samo Delphi za iOS)
[ itf @ 14.07.2012. 10:14 ] @
Tek u XE3 verziji sve dolazi (vidio sam betu).