|
Dakle moje staro pitanje: kako se koriti QSemaphore ili bilo koji semafor bilo gde i da li je to pravi način da ogrančim broj thread-ova u aplikaciji? bilo kakav link ili savet na tu temu mi je koristan. Što jedostavniji working example je idealno. |
|
Nisam siguran za tvoje pitanje, ali evo malo teorije. Semafori sluze za kontrolu pristupa podacima u threadovanom okruzenju. Ako imash vishe threada koji rade bilo shta nad istim podacima npr:
Ako global_arr-u pristupa vishe od jednog threada konkurentno, ovo parce koda morash staviti u blok semafora. Na pocetku wait(global_arr_sem) i na kraju release(global_arr_sem). Time cesh obezbediti da u te 3 linije koda u jednom trenutku moze da bude samo jedan thread, kako se nebi desilo da 2 threada urade citanje global_arr[5] onda ga oba inkrementiraju za 2 i upishu nazad, gde bez semaphora dobijesh polje uvecano za 2 umesto za 4 (jer su 2 threada uvecavala za po 2). Inace, ovo u java-i postoji u totalno drugom obliku (mnogo lakshem za shvatiti :). U java-i kad ti treba ovo jednostavno uradish:
Ili jednostavno celu metodu koja radi neshto, proglasish za synchronized. A za ogranicavanje threadova, nisam siguran kolko ovo reshava problem. Ali svakako mora da se upotrebi kao deo reshenja, jer teshko programirati bilo shta u threadovima bez semaphora. Ono shto bi tebi mozda reshilo problem je Queue. Podignesh 10 threadova, napravish Queue. Svaki thread je u
Onda gde god imash neshto da treba da procesiraju ti 10 threadova, ti uzmesh spremish shta treba da rade i gurnesh u Queue, prvi slobodan thread ce to uzeti i poceti da radi na tome. To bi bio mutex koji dozvoljava samo jedan ulazak u kritičnu sekciju, semaphore dozvoljava N ulazaka. Ulazak smanjuje vrednost semafora, izlazak povećava. Ako je semafor na nuli, aktivira se čekanje. Može da se implementira pomoću brojača i mutexa.
(Aug 31 '10 at 11:48)
grakic
mutex mi je jasan i on radi kako treba, i ovo mi bas zvuci kao mutex.
(Aug 31 '10 at 12:18)
homoludens
|
|
Semafori se koriste da osiguraju (ajmo reći) serijski pristup broju sličnih resursa. Evo dva linka na dobre (i jednostavne) primjere za QSemaphore u C++. Pošto je QSemaphore samo wrapper oko C++ poziva, mislim da je više nego jasno kako radi semaphore iz primjera (imaš odmah i jednostavno objašenjenje putem kino karata): http://www.infernodevelopment.com/qthread-qmutex-qsemaphore-and-multi-threaded-applications Malo opširnije objašnjenje mutexa i semafora (baš kroz QMutex i QSemaphore): http://www.civilnet.cn/book/embedded/gui/qt4/ch18lev1sec2.html A preporučio bih i čitanje dokumentacije (što vjerujem da si prošao): http://www.pyside.org/docs/pyside-dev/PySide/QtCore/QSemaphore.html Inače, znam da sam negdje čitao da Python neko vrijeme nije imao potpunu implementaciju QSemaphore, pa provjeri koju verziju imaš za svaki slučaj - ako te to slučajno sprečavalo u ispravnoj implementaciji. dokumentaciju i slicne primere sam pregledao nekoliko puta, ali ova druga dva linka mi deluju korisno. pregledacu ih, nadam se vec danas.
(Aug 31 '10 at 12:19)
homoludens
|
|
Članak Multithreading iz knjige "C++ GUI Programming with Qt4" je meni super pojasnio stvari. Ima i dobar broj primjera. Nakon ovog članka ako ti nije jasno bilo bi super da napišeš točno što bi htio napraviti pa možemo raspisati rješenja. Ako radiš u Qt-u bez pythona preporučam da pogledaš: Qt Concurrent. Zbog Pythonovog GIL-a ovaj dio Qt-a nije prebajndan u PyQt4. probacu da prelgedam linkove i da zakljucim sta mi tacno treba. nije lako pitati pitanje kada nisam siguran sta mi je tacno problem, samo znam da googlanjem nisam daleko stigao. a onda cu moci da izdvojim samo taj deo koda i da pitam konkretno. svaki dalji link je svakako koristan - nikada nisam siguran kakav će mi tekst razrešiti nedoumice.
(Aug 31 '10 at 12:23)
homoludens
|