Op verzoek van Qlone ([rml]Qlone in "[ C++] Server met Clients efficient?"[/rml]) open ik een nieuw topic voor deze discussie.
Complexere en tragere code door locking.
Complexere debugging, non-deterministic gedrag.
Performance-verlies door thread-switching.
Meer memory nodig voor (thread) stacks.
Dat hangt natuurlijk af van het type server, maar voor bijvoorbeeld een FTP server zijn timers IMO niet nodig. Als de server single-threaded is, is ITC ook niet mogelijk.
Bijna. De nadelen van threads zijn IMO:Verwijderd schreef op 24 november 2003 @ 00:40:
Onder windows zijn threads zo handig in het gebruik dat het bijna zonde is om geen gebruik te maken van multithreading. Onder unix is threading er later min of meer bij bedacht en blijft de gangbare aanpak toch een beetje zoveel mogelijk single threaded werken of gebruik maken van worker processes (met het geniale fork()) en wat pipes of sockets voor de communicatie tussen deze processen.
Complexere en tragere code door locking.
Complexere debugging, non-deterministic gedrag.
Performance-verlies door thread-switching.
Meer memory nodig voor (thread) stacks.
Zeker waar. Maar zijn die zaken ook nodig in servers?Select kan wachten op een file descriptor (file, socket, pipe, dat soort spul). Wil je wachten op iets anders dan een filedescriptor (timer, bericht van een andere thread) dan laat select je redelijk in de steek. Je kan dan andere manieren gebruiken om de aandacht van je proces te trekken (SIGALRM, SIGIO) maar dat vind ik zelf minder mooi dan de windows aanpak, waar je met WaitForMultipleEvent kan wachten op (max 64) 'signalable handles'. Alle file handles (gemaakt met CreateFile(), dus dingen als files, devices, named pipes) vallen hier onder, maar ook Events (een windows iets), Thread handles (handle is 'signalled' als thread afsluit... onder unix gebruik je daarvoor als ik me goed herrinner een van de 'wait()' calls), en dan vergeet ik er vast nog wel een paar...
Dat hangt natuurlijk af van het type server, maar voor bijvoorbeeld een FTP server zijn timers IMO niet nodig. Als de server single-threaded is, is ITC ook niet mogelijk.
Voor servers is dat geen issue, voor clients wel. Maar voor clients is de performance weer niet zo'n issue.Ook een leuke in windows (al heb ik het nooit gebruikt) is dat winsock messages kan sturen naar de GUI van een applicatie (via WSAAsyncSelect). Zo kan een GUI app non-blocking werken en toch handig socket dingen doen zonder polling of extra threads...
offtopic:
Dit is wel een beetje offtopic aan het lopen. Ik ben best te vinden voor een discussie over de voors en tegens van winsock vs BSD sockets, maar mischien handig om dat in een ander topic te doen.
[ Voor 3% gewijzigd door Olaf van der Spek op 25-11-2003 15:55 ]