[ Predrag Damnjanovic @ 30.08.2002. 14:03 ] @
Dakle, kako servisi, recimo Apache, postizu to da rade istovremeno sa vise klijenata?
Treba mi samo osnovno objasnjenje, da bi znao na sta da se fokusiram?
Moze i neki link...
[ Ivan Dimkovic @ 30.08.2002. 14:39 ] @
multithreading
[ Predrag Damnjanovic @ 30.08.2002. 14:46 ] @
Jel' bi ono trebao da bude link, ili keyword za search? :)
[ Ivan Dimkovic @ 30.08.2002. 14:58 ] @
Keyword za search -- mislim da sam pisao o tome nekada davno na C/C++ forumu, mozes i da pogledas....

Thread (nit) je deo programa koji se paralelno izvrsava sa ostatkom. Kada se startuje program to je "glavna nit" (main thread) a ti mozes kreirati druge iz nje.

Evo ti glup kod koji ti objasnjava osnovni princip:

Code:

#include <windows.h>
#include <stdio.h>

void nit1()
{
    do {
        printf("Pozdrav iz niti 1\n");
        Sleep(300);
    } while(1);

}

void nit2()
{
    do {
        printf("Pozdrav iz niti 2\n");
        Sleep(300);
    } while(1);

}


void nit3()
{
    do {
        printf("Pozdrav iz niti 3\n");
        Sleep(300);
    } while(1);

}


void main()
{

    DWORD dwTID1, dwTID2, dwTID3;
    HANDLE trd1, trd2, trd3;
    
    trd1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)nit1, 0, 0, &dwTID1);
    trd2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)nit2, 0, 0, &dwTID2);
    trd3 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)nit3, 0, 0, &dwTID3);

    do {
        printf("Pozdrav iz glavne niti\n");
        Sleep(300);
    } while(1);

}


[ Ivan Dimkovic @ 30.08.2002. 15:03 ] @
Kod socketa (TCP/IP) je fora da ti "slusas" neki port, zatim dobijes zahtev - uspostavis socket vezu a onda procesiras komunikaciju sa tim klijentom preko posebne niti (thread) - ima dosta lepog koda koji ti objasnjava kako funkcionise client/server socket komunikacija u multithreading okruzenjima.
[ Dragi Tata @ 30.08.2002. 17:37 ] @
Najtoplije ti preporučujem da (bar za početak) ne radiš direktno sa nitima, već da koristiš neku threadpool klasu, jer će to jako da ti olakša život. Recimo, ima jedna takva koja radi i sa Windows-om i sa Linux-om na

http://www.codeproject.com/threads/threads.asp

Mogu ti reći da su bagovi vezani za višenitno programiranje (posebno race conditions) nešto najgore sa čime sam se sreo u svojoj dosadašnjoj programerskoj karijeri.

Uzgred, Ivane, znam da je onaj gornji primer bio samo "na brzaka", ali da upozorim ljude da za kreiranje niti pod Windows-ima koriste _beginthreadex funkciju, a ne CreateThread (osim ako se pravi program bez CRT-a). Ko želi više detalja o ovome, neka pogleda

http://www.microsoft.com/msj/d...m&nav=/msj/0799/newnav.htm
[ Ivan Dimkovic @ 30.08.2002. 17:48 ] @
Jao da... zaboravih da sam koristio printf() , eto to je jedan bag koji bi mogao u necemu komplikovanijem da napravi frku ...

Slazem se sa Tatom - bagovi koji nastaju u multithreading aplikacijama su stvarno gadni i vrlo teski za lociranje i otklanjanje - zato treba pazljivo planirati delove aplikacije koje se izvrsavaju paralelno.
[ Predrag Damnjanovic @ 30.08.2002. 19:17 ] @
A na Linuxu, da li CreateThread postoji?
[ Dragi Tata @ 30.08.2002. 19:21 ] @
Linux koristi POSIX threads. Pogledaj

http://dis.cs.umass.edu/~wagner/threads_html/tutorial.html

[ leka @ 30.08.2002. 19:35 ] @
Naravno da ne postoji Peco... CreateThread je Micro$oft izmisljotina, kao i mnogo drugih stvari.
Citat:
Predrag Damnjanovic:
A na Linuxu, da li CreateThread postoji?


Moj savet, znaci MOJ savet (tako da drugi nemaju sta da komentarisu ovo), za tebe je da koristis POSIX niti koje verovao ili ne rade fantasticno na Windows-u takodje. Imas gotove DLL-ove (trazi +posix +threads +win32 na google), a takodje mozes da skines source i iskompajliras.

Na Linux-u postoji sijaset alternativa za POSIX threads, ali narod normalno koristi POSIX stvari jer to je STANDARD.

E sad poslastica - zove se GNU Pth, POSIX threads bazirana biblioteka, visoko portabilna biblioteka za niti koja dolazi ravno iz GNU borbenih redova... URL: http://www.gnu.org/software/pth/pth.html . Skines lepo source i u demo (ili test) direktorijumu imas gotov web server recimo :) . Bolji primer za koriscenje niti neces naci veruj mi.
[ Dragi Tata @ 30.08.2002. 19:46 ] @
Ih, bre Leko, što se odmah brecaš? Pa i ja sam mu savetovao da koristi POSIX. Mada, kada bih radio neki OS-nezavisni program sa nitima, pre bih koristio Boost.threads, ali to je C++, a Peca čini mi se više voli C.
[ leka @ 30.08.2002. 19:57 ] @
NemaNJO :)
Mah, nisam se brecao bre, samo ne volim da se ljudi nadovezuju na nesto sto je individualno misljenje. :)

Pricali smo o Boost-u ja mislim ovde... Jesi li probao CommonC++ ? Ovaj novi pogotovo?
[ Dragi Tata @ 30.08.2002. 20:11 ] @
Nisam probao CommonC++, mada sam čuo za njega.

Nego, gledam malo onu dokumentaciju za pth, i koliko ja razumem, to su user-mode niti koje ne omogućavaju iskorišćenje više procesora. Doduše, ne verujem da Peca ima višeprocesorsku mašinu, ali u principu više volim da se oslanjam na kernel niti (tako su uradili i sa Apache 2).
[ Predrag Damnjanovic @ 30.08.2002. 21:48 ] @
Ma kak'e biblioteke, ja volim direktnu komunikaciju sa kernelom :)

Code:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *first_thread(void *arg)
{
    int i;
    for (i=0; i<100; i++)
    {
        printf("Prvi thread\n");
        sleep(1);
    }
}


void *second_thread(void *arg)
{
    int i;
    for (i=0; i<100; i++)
    {
        printf("Drugi thread\n");
        sleep(1);
    }
}


int main(int argc, char* argv[]){

    pthread_t thread1;
    pthread_t thread2;

    pthread_create(&thread1, NULL, first_thread, (void*)NULL);
    pthread_create(&thread2, NULL, second_thread, (void*)NULL);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    return 0;
}


Nego, da li je pthread samo Linux specific, ili radi na svim Unix-ima?
[ Dragi Tata @ 30.08.2002. 21:54 ] @
Pthreads radi na većini modernih Unix-a, ali ako voliš direktnu komunikaciju sa kernelom, a mrziš biblioteke, onda batali i pthreads i koristi clone().
[ leka @ 30.08.2002. 21:59 ] @
Sto se tice kernel niti, ne treba da podsecam da Linux ima kernel threads ... pa ko voli, nek izvoli, ali onda ta aplikacija nece biti portabilna tako lako (mora da se pise kod za svaku platformu zasebno)...
[ Reljam @ 31.08.2002. 01:37 ] @
Citat:
Ivan Dimkovic:
Jao da... zaboravih da sam koristio printf() , eto to je jedan bag koji bi mogao u necemu komplikovanijem da napravi frku ...


printf je threadsafe, ne bi trebao da pravi probleme. Zasto si to rekao?
[ Dragi Tata @ 31.08.2002. 03:17 ] @
printf je threadsafe, pod uslovom da se koristi MT verzija CRT-a. Ako se niti kreiraju sa _beginthreadex, kompajler će da prijavi grešku ako se koristi ST verzija, a ako se kreiraju sa CreateThread onda će lepo da se kompajlira, ali će biri runtime belaja.
[ Ivan Dimkovic @ 31.08.2002. 10:30 ] @
Iz licnog iskustva - mislim da sam jednom napravio ovu istu gresku u velikom projektu, i onda sam izgubio 3-4 dana pitajuci se zasto program iz svih mogucih i nemogucih razloga generise raznorazne abnormalne greske!!

Svakako i ja preporucujem POSIX :)
[ Predrag Damnjanovic @ 31.08.2002. 16:01 ] @
Moze li neko da mi objasni zasto ce printf da pravi greske?
Da li ce se to desiti i u linuxu sa pthread-om?
Koliko sam shvatio, i na Windowsu nece biti problema ako koristim _beginthreadex ?

P.S. Oduvek sam se pitao sta znace skracenice CRT, MT, i ST.
Moze neko da mi kaze sta te skracenice znace?
[ Ivan Dimkovic @ 31.08.2002. 16:18 ] @
Ni na linux ni na win32 platformi printf() sam kao takav nece praviti greske - problemi mogu nastati na Win32 platformi ako koristis druge CRT funkcije koje koriste TLS (tj. neke globalne podatke u CRT biblioteci koji nece biti iskopirani u TLS)

Za linux i pthreads - ne znam, ali ne verujem da bi bilo problema, ali neka Leka to odgovori, on je svakako mnogo kompetentniji za Linux programiranje od mene.

ST i MT su "single threaded" i "multi threaded"
[ Dragi Tata @ 31.08.2002. 18:43 ] @
Mislim da na Linux-u moraš da kompajliraš sa opcijom REENTRANT ili tako nešto da ne bi bilo problema, ali kao što Ivan reče, pitaj Leku.
[ Dejan Lozanovic @ 31.08.2002. 19:34 ] @
Citat:
Dragi Tata:
Pthreads radi na većini modernih Unix-a, ali ako voliš direktnu komunikaciju sa kernelom, a mrziš biblioteke, onda batali i pthreads i koristi clone().

Ma batali me klona, pa da semaforu koristim na savkom mestu, to mozda lici kao prihvatljivo u pocetku ali ima da se umotas kao pile u kucine. za takve stvari je fork i shared memory. i to je kernel
[ Dragi Tata @ 31.08.2002. 20:44 ] @
fork u stvari interno zove clone na Linux-u, tako da mu se svodi na isto. Uglavnom, mislim da ni jedno ni drugo nije dobro rešenje, već POSIX threads, kao što sam preporučio na početku, i to preko nekog thread pool-a.
[ leka @ 01.09.2002. 21:09 ] @
Koliko znam sve standardne C funkcije su zahvaljujuci ljudima koji su se okupili iza POSIX-a odavno thread-safe.
UNIX (i C uz njega) je keva narode...