2010-10-14 4 views
8

E cosa succede quando provo a generare troppe persone?Quanti thread posso generare utilizzando boost in C++?

che sto ottenendo il seguente errore quando depongono le uova più di circa 900 discussioni:

terminate called after throwing an instance of 'dining 1 
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> 
>dining 3 
' 
dining 2 
    what(): dining 4 
boost::thread_resource_errordining 3 

E 'questo l'errore previsto derivante dal tentativo di generare troppi thread?

+0

Probabilmente esiste un limite del sistema operativo. Verifica con il manuale del tuo sistema. –

+1

Solo per interesse, a cosa servono i 900 thread? –

+0

@Mark: sembra un'istanza di thread 900 di Dining Philosophers. –

risposta

9

Ricorda che ogni thread deve riservare lo spazio di stack. Questo è il motivo per cui esiste un limite al numero di thread che puoi generare. Sembra che tu stia colpendo questo limite o che l'incremento ti impedisca di raggiungere questo limite.

Ecco un link alla più recente documentazione di spinta che documenta il comportamento che state vedendo (l'eccezione generata): boost thread docs (ricerca di boost :: thread_resource_error in quella pagina)

4

Quanti si possono generare dipendono dai vincoli del proprio ambiente operativo. E sì, boost::thread_resource_error è quello che dovresti aspettarti quando non è possibile ottenere le risorse thread appropriate di cui ha bisogno, per the documentation

+1

incidentalmente, ho una domanda stupida. Approssimativamente quanti saranno in Windows? Intorno al 10? 50? 100? 1000? 10000? –

+0

Dipende molto da molte cose. Quanta memoria hai, se ci sono dei vincoli a livello di sistema operativo, ecc. La risposta generale sarebbe "probabilmente almeno 1 (ma dovresti controllare) e forse molto di più" –

+0

Lo metterò in un altro modo .È realistico avere 10K di thread avviati in Windows in un singolo processo? –

0

Non ci sono operativi i limiti del sistema. Principalmente si ridurrà a quanta memoria hai sul tuo sistema. Se ricordo correttamente ogni thread pthread è dato un minimo di 32 megabyte di memoria. L'impostazione predefinita è molto di più.

1

Si sta raggiungendo un limite rigido. Come altri hanno già detto ci possono essere due limitazioni:

  • il numero di thread un processo può generare è limitata dal sistema operativo (globale o per ogni processo)
  • la memoria è limitata e ogni filo riserva propria stack (in genere pochi MB e 4 MB * 900 -> 3,6 Go)

Per inciso, questo è ciò che è così interessante sulle routine di Google Go. Invece di generare il maggior numero possibile di thread, il runtime Go adatta il numero di thread al numero di core disponibili e multiplex manualmente le routine su questi thread fisici.

Inoltre, le routine sono leggere (prenotando solo 4 KB ciascuna) perché non utilizzano uno stack tradizionale (scomparsa dello Stack Overflow!), Il che significa che è possibile estendere in modo efficace alcune routine su una macchina tipica e non ti costerà molto.

Se si desidera sperimentare con estrema parallelismo:

  • trovare il modo di ridurre lo spazio di stack allocato per thread (attenzione di Stack Overflow)
  • interruttore to Go, o trovare un'altra lingua routine
  • attuazione