Tcp szerver több szál gond

 ( siraly12 | 2014. szeptember 4., csütörtök - 15:39 )

Üdvüzletem.

Most tanulgatom a c++ nyelvet, alap dolgok már mennek.
Egy kis programot akarok írni saját használatra.
A program a következőkből állna, egy tcp szerver, ami egyszerre több kapcsolatot is fenn tud tartani kliensekkel.
Az interneten találtam sok forráskódot, és megtetszett egy. Ez multiklienses és multithread tcp szerver, tökéletes lenne a problémámra, de egy dolgot nem tudok megoldani benne.

A kód helye: https://github.com/rbaron/multichat

Abban kérnék segítséget, hogy hogyan tudnék egy vagy több saját szálat indítani? Mert szeretnék bizonyos időnként lefuttatni bizonyos kódokat.
A gondom az, hogy a program már eleve többszálas, és akármit próbálok ha a main.cpp fájlba a

//Main loop
s->AcceptAndDispatch();

elé teszem a saját szálam indítását, akkor az én szálam befejezését követően indul el a szerver, ami nekem nem igazán jó.

Tudna valaki ebben segíteni nekem?

Előre is köszönöm.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

"
elé teszem a saját szálam indítását, akkor az én szálam befejezését követően indul el a szerver, ami nekem nem igazán jó.

"

Mutasd a kodot!

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

Mint írtam még elég kezdő vagyok c++-ban.

Közben talán sikerült megoldanom:

void indit();

void * work(void * argument)
{
int i;
for( i=0; i < 20; i++ ){
cout << " world " << endl ;
sleep(1);
}
indit();
}

void indit()
{
pthread_t t1;
pthread_create(&t1, NULL, work ,NULL);
}

int main() {
indit();

Server *s;
s = new Server();
cout << "A szerver üzemel." << endl;
//Main loop
s->AcceptAndDispatch();

return 0;
pthread_exit(NULL);
}

Bár gondolom biztosan nem szép megoldás.

Közben még kicsit javítottam rajta, így nem kreálgat újabb szálakat feleslegesen:

void * work(void * argument)
{
int i;
i=0;
do{
cout << " world " << endl ;
sleep(1);
}while(i == 0);
}

Nem biztos hogy értem a problémádat, de ha elindítasz egy szálat (és nem várod meg amíg lefut (== nem join-olsz hozzá)), akkor az párhuzamosan fog futni a program további részével.

Amire érdemes figyelni, hogy a végén a fő szál várja be a többit.

Tehát, ha jól értem, az AcceptAndDispatch() előtt kell elindítanod a szálat, a végén pedig bevárni.

UPDATE: Ja és a github.com/rbaron/multichat tele van memory leak-kel, úgyhogy csak óvatosan :)

"UPDATE: Ja és a github.com/rbaron/multichat tele van memory leak-kel, úgyhogy csak óvatosan :)"

Esetleg, ha valaki tudna egy jobb, nem túl nagy, még átlátható c++ multithreaded chat szervert, akkor annak is nagyon örülnék.

Összedobtam egyet, habár std::thread-et használtam nem POSIX-et.

https://github.com/susu/simple-chat-server

Teszteltem clang thread és address sanitizer-el, szerintük nincs benne race condition és memória hiba.
(Ctrl-C nincs külön lekezelve, arra beszólt a valgrind "still reachable"-lel.)

Köszönöm, letöltöm és átnézem.

Ha csak most ismerkedsz c++-al, akkor ez egyelore valoszinuleg nem fontos szamodra, de talan erdemes emliteni, hogy ahhoz, hogy tobb klienst kezelhess egyszerre, nincs foltetlenul szukseged tobb threadre, sot, egy thread /kliens NAGYON hatekonytalan sok klienssel, jobb megoldas pl. libevent.

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

Ennek is utánanézek. Köszönöm a tanácsot.

Felig off, de ha most tanulod a C++-t, akkor javasolnam, hogy kapasbol a C++11-gyel kezd, onnantol mar van szabvanyos megoldas a threadkezelesre, az egyeb finomsagokrol nem is beszelve.

+1

(Vagy akkor már C++14-gyel. Clang 3.5 a napokban jön ki :)

Egyébként miért kell a több szál? Fölöslegesnek érzem a feladat szempontjából, kivéve ha pont az a cél, hogy konkrétan a többszálúsággal szivasd magad (és ebből tanulj).