[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]![]() |
![]() |
![]() |
|||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
![]() |
![]() |
![]() |
Hej RobertJeg regner med at have typisk et par hundrede (max 2 til firetusinde) sockets åbne for læsning og skrivning samtidig.
Der er forskellige metoder og nogle af dem er beskrevet her http://bulk.fefe.de/scalable-networking.pdfEn tråd per read() er nok den nemmeste måde at gøre det på, men da skal read()-write() helst være blocking af performancehensyn og for nem scheduling.
Men måske er jeg tvunget til at bruge select(), skønt der vist er nogle skaleringsproblemer i at bruge select på et par tusinde sockets samtidig.
Men selv select() er blokeret .. men der er vist en timer på. Så måske ved brug af select(), behøver jeg ikke at bruge KillThread.
Men hvad sker der ved at bruge KillThread på en tråd, der er i wait-block på read eller write ?
Er der noget med at man kan bruge signal() til at få en blokeret read til returnere ... bare uden at der er læst noget og med errno sat ? Vist nok til EAGAIN. Hmm man siger vist noget andet, men maaske kunne den sætte EINTR ? Ville det være en ide, at låse op for blocking read med signal og få dem til at returnerer-exit'te selv ?
Hmm, hvordan er det lige man læser errno, når man har et par tusinde blokerede reads eller writes ? errno er jo en fælles variabel for alle io-operationer.
Hvis SIGALRM er brugt til at få read() til at returnere med errno sat til EINTR, rejser det et par issues
a) Er der kun en read(), der returnerer med errno sat til EINTR per SIGALRM eller er det alle måske flere tusinde read(), der returnerer ?
b) Hvis read() returnerer -1 med errno sat til EINTR når jeg genererer SIGALRM, hvordan sikre man sig, at man kan læse errno inden en anden tråds I/O ændrer værdien i errno ?
mvh. P. Robert Larsen wrote:
Hej Det er et af de helt store problemer du har gang i og at terminere tråde pænt kræver nok en hel del omkodning, hvis du har brugt blokerende IO. Det pæneste vil være noget i stil med: int running = 1; void my_thread_method(void * ptr) { set_up_stuff(); while (running) { do_stuff(); } close_down_stuff(); } ...men det kræver at do_stuff() ikke blokerer. File descriptors (filer, sockets, osv.) bør da konfigureres til at være non blocking eller du kan bruge asynkron IO (aio_read, aio_write, osv.). Jeg mener også, at man kan få read/write til at returnere efter et antal millisekunder, men er ikke helt sikker på hvordan. Sikkert noget med fcntl() eller lignende.
![]() |
![]() |
![]() |
||||||||||||
|
||||||||||||||
![]() | ||||||||||||||
|
||||||||||||||
![]() |
![]() |
![]() |