[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]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] Terminering af tråde



Hej Robert

Jeg 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.pdf

En 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.



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2008-04-01, 02:01 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *