Kezdőoldal » Számítástechnika » Programozás » C++ szerver probléma, ha a...

C++ szerver probléma, ha a threadet includeolom, akkor a szerver folyamatos csatlakozásokat észlel. Mi lehet a gond?

Figyelt kérdés

Na szóval, problémám az az hogy:

Írtam egy szervert (google segítségével), a thread-et nem includeoltam, minden jól működik, telnetből fel is tudok menni rá.

De ugye a csatlakozásokat azért másik szálba kéne tenni mert leblokkol amíg vár.

Includeolom a thread-et, és lefordítom, hogy minden oké-e, de ekkor azt látom, hogy folyamatosan csatlakozásokat érzékel, és írja ki folyamatosan hogy új csatlakozás történt, holott csak a thread lett includeolva.



2013. nov. 22. 20:29
 1/7 iostream ***** válasza:
Nem kell thread. Képzeld el, hogy van egy szerver, ami másodpercenként 10000 kérést szolgál ki. Szerinted mindegyikre létrehoz egy új szálat? Nem, van egy select nevű függvény. Ennek nézz utána.
2013. nov. 22. 22:26
Hasznos számodra ez a válasz?
 2/7 A kérdező kommentje:

1 szálat akarok csak létrehozni, ami kezeli a csatlakozásokat.

Az accept használatát még nem értettem meg.

2013. nov. 22. 22:50
 3/7 A kérdező kommentje:
select*
2013. nov. 22. 22:50
 4/7 anonim ***** válasza:
27%

Ha 10000 kérésed van másodpercenként akkor célszerű mindegyikre új szálat indítani. Nem mindegy, hogy egy core küszködik vele vagy 8,10,20,32 stb.


A "threadet includeoltam" mondatot nem sikerült értelmeznem. Mit includoltál és hol?


Van egy accept-od ami ugye blockol addig amíg nem érzékel új kapcsolatot (blocking modeban természetesen de úgy vettem ki így szeretnéd használni).


Amikor az accept-od visszatér (tehát kapcsolódás történt) indítasz egy szálat, az accept által visszaadott socketet átadod neki paraméterként, és a threadben kezeled le az adott kapcsolat read/write-jait. Ez a thread-ed addig él amíg a kapcsolatod. Az eredeti pedig visszatér accept-be.


Ha ez már működik elkezdhetsz játszani a select-tel és a pollal. Ajánlom olvasásra "Beej's Guide to Network Programming". Ha jól emlékszem van valahol magyar fordítása is.

2013. nov. 23. 01:28
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:

@Gru: Nem! Nem indítunk mindegyikre új szálat, maximum párat, ugyanis egy szál elindításának és életben tartásának baromi nagy overheadje van.

Nézd meg az apache és mondjuk az nginx közötti memória használati különbségeket. Az első sok-sok szálat indít, a második alig.

Az első több ezer kérés/sec-nél már halódni is kezd, de több GB memóriát megeszik, utóbbi ugyan annyitól meg sem izzad.


Igen, kezdőknek, ha próbálgatni kell még elmennek a szálak, vagy kisebb alkalmazásba is jó, de ahogy iostream is mondta, ott a select függvény.

Hasznos linkek:

[link]

[link]

2013. nov. 23. 01:50
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

Az ngninx processekkel oldja meg a párhuzamosítást, tehát nem kezel egy szálban minden kapcsolatot. Egy process elindításának és leállításának még nagyobb overheadje van mint egy threadnek, azért is használ process poolt, mint ahogy thread poolt is lehet használni. (és a stack méretet is lehet szabályozni, egyes népszerű linux distroknál ez defaultból 10M, ami jóval több mint amire általában szükség van)

Megteheti mindezt azért, mert két bejövő http requestnek elég kevés köze van egymáshoz, így ez egy elég szélsőséges eset. Legtöbbünk nem ilyen szerencsés, és bizony gyakran előfordul, hogy meg kell osztani dolgokat (shared state) egymás között.


Végezetül egy (ellen) példa: a legnépszerűbb voip b2bua nem is 1 hanem 2 szálat indít hívásonként (1 szál/kapcsolat). Nem egy kis alkalmazás, és ugye senki sem boldog ha akad a hang ha épp beszélget valakivel. Nem nagyon van ideje a 20ms-enként jövő csomagoknak, hogy sokáig várakozzanak az event queueban.

2013. nov. 23. 03:28
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:

Köszönöm a válaszokat!

A kérdést lehet rosszúl tedtem fel...

Itt van kép a problémámról:

Így működik, ha nincs a kódban #include <thread>

[link]


Ha már van benne #include <thread>, akkor befloodolja azt hogy van csatlakozás:

[link]


A thread-et használni szeretném, de ahogy incluedolom, már előjön a probléma.

2013. nov. 23. 23:08

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!