[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



Robert Larsen wrote:
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.
Med så mange ville jeg bruge epoll().
Det gør ca. det samme som select() men meget mere effektivt.

Den vil jeg kigge på. Lyder rigtigt.

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.
Både select() og epoll() kan times ud (sidste parameter på select() og
epoll_wait()).
Men hvad sker der ved at bruge KillThread på en tråd, der er i
wait-block på read eller write ?
Den stoppes uden at få en chance for at rydde op efter sig.

Men det er ikke specificeret, at tråden ER stoppet når KillThread returnerer. Dvs, man ved ikke om et blokerende read() i den tråd der slåes ihjel er ved at skrive til en buffer som man efter at have slået tråden ihjel, ønsker at sætte fri (free(buffer)).

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.
Jep. errno er fra før multithreading tiden, så den er lidt farlig at
stole på.

Viser sig at errno er unik for hver tråd. Men jeg kan ikke lige se, hvordan man kan sende et specifikt signal til en specifik tråd på en nogenlunde portabel måde. Hvis man kan det, kan man sende et signal, der får en blokerende read() eller write() til at returnere med fejl og errno sat. Og så kan tråden selv terminere og rydde pænt op.

Jeg tror, at den "nemmeste" løsning vil være at bruge select()/epoll().
Bare lige en advarsel, jeg prøvede engang at bruge mere end 1024
filedescriptors i select() og fik det aldrig til at virke. Det virkede
heller ikke at redefinere FD_SETSIZE, som man ellers kan gøre i andre
operativ systemer, så jeg er stort set gået over til udelukkende at
bruge epoll(), medmindre jeg skal bruge select()'s portabilitet.

Hmm, epoll er vist meget Linux-specifik. Ville gerne have en portabel løsning, der også virker på Windows og Windows-CE.

Men ja, select har problemer med et større antal FD.

mvh.

P.


 
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] *