prijava O stranici čpp

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.

pitano Aug 31 '10 at 00:58

homoludens's gravatar image

homoludens
88228

uređeno Aug 31 '10 at 01:04


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:

int a = global_arr[5];
a += 2;
global_arr[5] = a;

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:

synchronized(this) {
  // block u kome sme samo jedan thread da bude.
}

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

while (1) {
  cekaj_dok_se_u_queuu_ne_pojavi_novi_podatak();
  radi_nad_tim_podatkom();
}

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.

odgovoreno Aug 31 '10 at 04:18

zsteva's gravatar image

zsteva
3111111

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.
palo mi je na pamet da broj thredova ogranicim brojacem i mutex-om ali se nisam snasao u 15 minuta koje sam odvojio za to, jer mi je pored semafora delovalo kao nepotrebno budzenje i nisam našao da to neko radi pa sam odustao. a kako mi je cilj da naučim nešto korisno, Što semafori definitivno jesu.

(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.

odgovoreno Aug 31 '10 at 09:17

kost's gravatar image

kost ♦♦
5564821

uređeno Aug 31 '10 at 11:52

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

Možda ti zapravo treba QThreadPool? http://doc.qt.nokia.com/4.6/qthreadpool.html

odgovoreno Sep 01 '10 at 23:17

%D0%B4%D0%B0%D0%BC%D1%98%D0%B0%D0%BD's gravatar image

дамјан
312

uređeno Sep 01 '10 at 23:19

Č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.

odgovoreno Aug 31 '10 at 11:39

marcell's gravatar image

marcell ♦
2111310

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
Vaš odgovor
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Odgovora

Answers and Comments

Oznake pitanja:

×2
×1
×1
×1
×1

question asked: Aug 31 '10 at 00:58

question was seen: 1,500 times

last updated: Sep 01 '10 at 23:19

powered by OSQA