2009-03-08 24 views
6

Ho qualche problema nella mia prima incursione nei thread in C. Sto provando (per ora) a scrivere un programma server molto semplice che accetta una connessione socket e avvia un nuovo thread per elaborarlo. Sembra funzionare bene tranne che creerà solo circa 300 thread (303, a volte 304) prima che pthread_create() fallisca con il codice EAGAIN, che significa:Perché pthread_create() fallisce con solo 2 thread attivi?

"Il sistema non disponeva delle risorse necessarie per creare un altro thread, o il limite imposto dal sistema sul numero totale di thread in un processo {PTHREAD_THREADS_MAX} verrebbe superato. "

Questo è non thread 303 allo stesso tempo - ogni thread termina che è confermato da gdb. Ogni volta che viene chiamata la funzione di richiesta del processo, ci sono due thread in esecuzione.

Quindi significa "il sistema mancava delle risorse necessarie". La mia domanda è (e potrebbe essere un po 'stupida) - quali sono queste risorse? Presumibilmente si tratta di una perdita di memoria nel mio programma (certamente possibile, probabilmente anche), ma avrei pensato che anche così avrebbe potuto gestire più di 300 considerando che il resto del programma fa molto poco.

Come posso sapere quanta memoria è disponibile sul mio programma per confermare che si sta esaurendo? C'è un sacco di memoria e swap gratis quindi presumibilmente c'è un limite artificiale imposto dal sistema operativo (Linux).

Grazie

+0

Puoi pubblicare lo snippet di codice che crea e distrugge i thread? –

risposta

10

Se non si sta creando il filo con l'attributo PTHREAD_CREATE_DETACHED (o staccandole con pthread_detach(), potrebbe essere necessario chiamare pthread_join() su ogni thread creato dopo esce per liberare le risorse ad esso associati.

+0

Grazie! Basta impostare questo attributo ed è passato ben oltre 4000 thread e conteggi. Grazie mille - sono state risolte 3 ore di frustrazioni :) – Ray2k

0

Forse un po 'eccessivo (?), Ma Valgrind può aiutare a individuare memleaks in Linux.

Potresti postare qualche frammento di codice? Preferibilmente le parti in cui allocate/liberate memoria/socket e dove create i vostri thread.