Domanda

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 per il fatto che creerà solo circa 300 thread (303, a volte 304) prima che pthread_create () fallisca con il codice EAGAIN, che significa:

" Nel sistema mancavano le risorse necessarie per creare un altro thread o il limite imposto dal sistema sul numero totale di thread in un processo {PTHREAD_THREADS_MAX} sarebbe stato superato. "

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

Quindi significa che "al sistema mancavano le risorse necessarie". La mia domanda è (e potrebbe essere un po 'stupida): quali sono queste risorse? Presumibilmente è una perdita di memoria nel mio programma (certamente possibile, probabilmente anche), ma avrei pensato che anche così poteva gestirne più di 300 considerando che il resto del programma fa molto poco.

Come posso sapere quanta memoria è disponibile il mio programma per confermare che si sta esaurendo? C'è molta memoria e spazio libero, quindi presumibilmente c'è un limite artificiale imposto dal sistema operativo (Linux).

Grazie

È stato utile?

Soluzione

Se non stai creando il thread con l'attributo PTHREAD_CREATE_DETACHED (o scollegandoli con pthread_detach () , potresti dover chiamare pthread_join () su ogni thread creato dopo la sua uscita per liberare le risorse ad esso associate.

Altri suggerimenti

Forse un po 'eccessivo (?) ma Valgrind può aiutarti a localizzare memleak in Linux.

Potresti forse pubblicare alcuni snippet di codice? Preferibilmente le parti in cui si allocano / liberano memoria / socket e dove si creano i thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top