Linux non ha un limite di thread separati per processo, solo un limite al numero totale di processi sul sistema (i thread sono essenzialmente solo processi con uno spazio di indirizzi condiviso su Linux) che puoi visualizzare in questo modo:
cat /proc/sys/kernel/threads-max
Il valore predefinito è il numero di pagine di memoria/4. Puoi aumentarlo come:
echo 100000 > /proc/sys/kernel/threads-max
C'è anche un limite al numero di processi (e quindi di thread) che un singolo utente può creare, vedi ulimit/getrlimit
per i dettagli relativi a questi limiti.
Questo è SBAGLIATO dire che LINUX non ha un limite di thread separati per processo.
Linux implementa indirettamente il numero massimo di thread per processo!!
number of threads = total virtual memory / (stack size*1024*1024)
Pertanto, il numero di thread per processo può essere aumentato aumentando la memoria virtuale totale o diminuendo la dimensione dello stack. Tuttavia, una riduzione eccessiva della dimensione dello stack può portare a un errore del codice a causa dell'overflow dello stack mentre la memoria virtuale massima è uguale alla memoria di scambio.
Controlla la tua macchina:
Memoria virtuale totale:ulimit -v
(l'impostazione predefinita è illimitata, quindi è necessario aumentare la memoria di scambio per aumentarla)
Dimensione totale dello stack:ulimit -s
(l'impostazione predefinita è 8 Mb)
Comando per aumentare questi valori:
ulimit -s newvalue
ulimit -v newvalue
*Sostituisci il nuovo valore con il valore che vuoi impostare come limite.
Riferimenti:
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
In termini pratici, il limite è solitamente determinato dallo spazio dello stack. Se ogni thread ottiene uno stack da 1 MB (non ricordo se questo è l'impostazione predefinita su Linux), allora un sistema a 32 bit esaurirà lo spazio degli indirizzi dopo 3000 thread (supponendo che l'ultimo GB sia riservato al kernel) .
Tuttavia, molto probabilmente si verificheranno prestazioni terribili se si utilizzano più di poche dozzine di thread. Prima o poi, si ottiene un sovraccarico eccessivo per il cambio di contesto, eccessivo sovraccarico nello scheduler e così via. (La creazione di un gran numero di thread non fa altro che consumare molta memoria. Ma molti thread con lavoro effettivo ti rallenterà mentre stanno lottando per il tempo di CPU disponibile)
Cosa stai facendo dove questo limite è persino rilevante?