2010-10-14 3 views
8

Et que se passe-t-il lorsque j'essaie d'en engendrer trop?Combien de threads puis-je générer en utilisant boost en C++?

Je reçois l'erreur suivante quand je Spawn plus d'environ 900 fils:

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 

Est-ce l'erreur attendue résultant de tenter de reproduire trop de threads?

+0

Il existe probablement une limite du système d'exploitation. Vérifiez avec le manuel de votre système. –

+1

Juste par intérêt, à quoi servent les 900 fils? –

+0

@Mark: ressemble à une instance de 900 threads de Dining Philosophers. –

Répondre

9

Rappelez-vous que chaque thread doit réserver l'espace de la pile. C'est pourquoi il existe une limite au nombre de threads que vous pouvez générer. Il semble que vous atteigniez cette limite ou que le boost vous empêche d'atteindre cette limite.

Voici un lien vers la plus récente documentation boost qui documente le comportement que vous voyez (l'exception levée): boost thread docs (recherche de boost :: thread_resource_error sur cette page)

4

Combien vous pouvez générer dépend des contraintes de votre environnement d'exploitation. Et oui, boost::thread_resource_error est ce que vous devez attendre quand il ne peut pas obtenir les ressources de thread appropriées dont il a besoin, per the documentation

+1

d'ailleurs, j'ai une question stupide. Environ combien il sera dans Windows? Environ 10? 50? 100? 1000? 10000? –

+0

Tout dépend de beaucoup de choses. Combien de mémoire vous avez, s'il y a des contraintes au niveau du système d'exploitation, etc. La réponse générale serait "probablement au moins 1 (mais vous devrez vérifier) ​​et peut-être beaucoup plus" –

+0

Je vais le dire autrement .Est-il réaliste d'avoir 10K lancés threads dans les fenêtres en un seul processus? –

0

Il y a des limites du système d'exploitation. Cela dépendra principalement de la quantité de mémoire que vous avez sur votre système. Si je me souviens bien chaque thread pthread est donné un minimum de 32 mégaoctets de mémoire. La valeur par défaut est beaucoup plus.

1

Vous atteignez une limite stricte. Comme d'autres ont dit qu'il peut y avoir deux limites:

  • le nombre de threads d'un processus peut Spawn est limité par le système d'exploitation (soit globalement, soit par processus)
  • la mémoire disponible est limitée et chaque thread se réserve sa propre pile (généralement quelques Mo, et 4 Mo * 900 -> 3,6 Go)

Incidemment, c'est ce qui est si intéressant au sujet des routines Google Go. Au lieu de générer autant de thread que possible, Go Runtime adaptera le nombre de threads au nombre de cœurs disponibles et multiplexera manuellement les routines sur ces threads physiques. En outre, les routines sont légères (elles ne réservent que 4 Ko chacune) car elles n'utilisent pas de pile traditionnelle (disparition du dépassement de pile!), Ce qui signifie que vous pouvez efficacement parcourir quelques milliers de routines sur une machine standard et cela ne vous coûtera pas beaucoup.

Si vous souhaitez expérimenter le parallélisme extrême:

  • trouver comment réduire l'espace de pile alloué par fil (méfiez-vous de débordement de la pile)
  • switch to Go, ou trouver une autre langue mise en œuvre des routines
Questions connexes