P
Hallo,
ich muss hier ein nicht von mir geschriebenes Programm debuggen und steige nicht ganz durch, da ich mit den "nativen" APIs von sockets und pthreads nicht so bewandert bin - habe bisher nur boost::thread und boost::asio verwendet.
Folgendes soll erreicht werden: Für jede eingehende TCP-Verbindung die accepted wird, soll ein thread aufgemacht werden, der sich um den weiteren Datentransfer kümmert.
Das sieht aktuell in etwa so aus:
void* run_thread(void* data)
{
printf("Thread is running.\n");
// cleanup funktion registrieren
pthread_cleanup_push(cancelhandler, 0);
// arbeiten...
pthread_cleanup_pop(0);
printf("Thread work finished.\n");
pthread_exit(NULL);
return NULL;
}
// in main:
while (1)
{
if ((connection_socket = accept(listening_socket, (struct sockaddr *)&their_addr, &sin_size) ) < 0 )
{
printf("Accept-error:");
switch(errno) {
//...
case EMFILE: printf("Cannot open a file: OPEN_MAX file descriptors are currently open in the calling process.\n"); break;
//...
}
exit(EXIT_FAILURE);
}
// kein accept-error:
printf("new connection\n");
pthread_t thread;
// thread daten initilisieren und in data speichern
pthread_create (&thread, NULL, run_thread, (void *) &data);
}
Das ist das minimal-Beispiel.
Das funktioniert auf den ersten Blick ganz anständig:
Wenn ich was schicke, kommt immer der "Dreisprung" "new connection, Thread is running" und irgendwann "Thread work finished" in der Konsole.
Wenn ich den Prozess aber mit einer ordentlichen Anfragedichte flute, passiert folgendes:
Irgendwann kommt immer nur noch "new connection" in der Konsole, aber kein "Thread is running", geschweige denn ein "Thread work is finished". Dann dauerts noch einen kurzen Moment und accept steigt aus mit der Meldung, das keine Filedeskriptoren mehr verfügbar sind.
Wenn die Threads wenigstens anlaufen würden und dann hängenbleiben oder ihre Cleanup-funktion nicht aufrufen würden, könnte ich das Problem ja verstehen, aber da die Threads irgendwann nur noch erzeugt, aber nicht mehr gestartet werden, verstehe ich es nicht.
Gehen mir vielleicht die Deskriptoren für Threads aus? Muss ich die "zurückgeben"?
Vielleicht kann mir mal ein POSIX-Guru zum Durchblick verhelfen.
Danke,
Phil
EDIT: Erledigt. War einfach krasse Kacke in dem Code. Filedeskriptoren teilweise nicht geclosed, threads nicht detached, ... In dem oben geposteten Code nicht erkennbar.