[ erno @ 26.11.2006. 13:59 ] @
zdravo,

imam mali problem. naime, dosad nisam nikako radio sa multithreading aplikacijama, a sad moram bas jednu takvu napisati. google-ao sam malo i nasao nekoliko primjera koji su ok. moj problem je da sam napisao server koji treba primati zahtjeve klijenata i poslati im response. dakle imam klasu server koja ima metode init(), connect, listen, accept, response... e sad, unutar moje runServerLoop metode ja cekam i prihvatam konekcije i nakon sto dodje request treba da pozovem funkciju pthread_create i da joj predam parametre koji vec odgovaraju. vazno je reci da je ova funkcija unutar moje klase Thread. dakle, napravim novi objekt Thread, pozovem metodu createNewThread i njoj predajem argumente koji se dalje prosljedjuju na pthread_create funkciju koja je unutar ove metode. kako mogu predati svoju metodu response iz Server klase ovoj metodi. pokusao sam, ali kaze da ova mora biti staticna, kad sam to uradio kaze da ne moze obradjivati atribute bez instance, sto je i logicno. ti atributi su zapravo conn_fd, client_address i client_len koje mi trebaju u metodi response. nadam se da nisam previse zakomplikovao sa objasnjenjem :-). mali primjer nebi bilo lose ili par linkova. hvala.

poz,
erno
[ Dragi Tata @ 26.11.2006. 20:12 ] @
Na stranu što ti strategija nije dobra (nov thread za svakog klijenta), u principu nešto ovako rešava tvoj problem:

Kreiraj slobodnu funkciju run, ovako nekako

Code:

void run (void* obj) 
{
  server* srv = reinterpret_cast<server*>(obj);
  srv->response();
}


Kad potzoveš pthread_create, prosledi tu funkciju kao pretposlednji parametar, a this kao poslednji i to je u principu to.

Ili još bolje, nađi neku gotovu C++ biblioteku za threading umesto da se gnjaviš pthreads-ima.
[ erno @ 27.11.2006. 13:39 ] @
thnx.

Citat:


Na stranu što ti strategija nije dobra (nov thread za svakog klijenta), u principu nešto ovako rešava tvoj problem:



to se trazi od mene. rado primam savjete ;-) pa...

Citat:


Kad potzoveš pthread_create, prosledi tu funkciju kao pretposlednji parametar, a this kao poslednji i to je u principu to.

Ili još bolje, nađi neku gotovu C++ biblioteku za threading umesto da se gnjaviš pthreads-ima.



ne smijem koristiti "gotove" biblioteke ;-).

hvala jos jednom i pozdrav. morat cu ovo isprobati pa se javim ako zapne.
[ Mr. NiceGuy @ 12.03.2007. 19:59 ] @
Izvadio sam ovu temu iz "naftalina" jer sam zainteresiran za doslovce istu stvar kao i erno.

Citat:
Na stranu što ti strategija nije dobra (nov thread za svakog klijenta)

Da li bi mogao ukratko objasniti zašto stvaranje nove niti za svakog klijenta ne valja?


@erno:
Ako ti nije teško (i ako nije tajna), izbaci što si napravio.
[ leka @ 16.03.2007. 20:20 ] @
erno, kao sto Nemanja rece, to ti nije bas najbolji koncept... Ljudi najcesce prave odgovarajuci "thread pool" (ograniceni broj niti koje opsluzuju konekcije) i kada se konekcija napravi (accept() vrati socket) niti se obaveste da je server prihvatio novu konekciju koja treba da se opsluzi. Uglavnom u POSIX svetu ljudi koriste pthread_cond_*() funkcije za ovo, pre svega pthread_cond_wait() (za cekanje na signal da postoji nova konekcija) and pthread_cond_signal() (za signaliranje da postoji nova konekcija).
[ erno @ 20.03.2007. 14:48 ] @
@leka

kako sam odmah na pocetku rekao nisam radio sa multithreading programiranjem do tad, tako da sam se bio malo izgubio u svemu tome. previse informacija, premalo vremena -> rezultat = shit :-). barem sam skontao neke stvari o pthread_* funkcijama. iskreno, pokusat cu ovo zaobilaziti ubuduce.

@Mr. NiceGuy

ja sam morao ovako realizovati: chat i game (neka jednostava) aplikacija zajedno, za svakog klijenta novi thread jer su trazili tako. osim toga nisam smio koristiti nikakvu extra biblioteku koja bi mi olaksala rad s threadovima.

poz

[ Buffy @ 09.04.2007. 01:15 ] @
Mozete li neko malo pojasniti zbog cega nevalja svakoj konekciji dati svoju nit? Da li zbog performansi aplikacije ili
je nesto drugo u pitanju?
Meni dosta ljepse izgleda da svakoj konekciji podarim nit, nego da koristim funkciju select.
select() mi nekako divlje izgleda.