Wie viele Threads kann ich mit boost in c ++ erstellen?

8

Und was passiert, wenn ich versuche, zu viele zu spawnen?

Ich erhalte den folgenden Fehler, wenn ich mehr als 900 Threads spawne:

%Vor%

Ist dies der erwartete Fehler, der aus dem Versuch resultiert, zu viele Threads zu erzeugen?

    
jonderry 14.10.2010, 20:48
quelle

4 Antworten

9

Denken Sie daran, dass jeder Thread Stapelspeicher reservieren muss. Aus diesem Grund gibt es eine Begrenzung für die Anzahl der Threads, die du spawnen kannst. Es sieht so aus, als ob du entweder dieses Limit erreichst oder der Boost dich daran hindert, dieses Limit zu erreichen.

Hier finden Sie eine Verknüpfung zur neuesten Boost-Dokumentation, die das von Ihnen beobachtete Verhalten dokumentiert (die ausgelöste Ausnahme): Thread-Dokumente laden (Suche nach boost :: thread_resource_error auf dieser Seite)

    
Michael Goldshteyn 14.10.2010, 20:50
quelle
4

Wieviel Sie spawnen können, hängt von den Einschränkungen Ihrer Betriebsumgebung ab. Und ja, boost::thread_resource_error ist das, was Sie erwarten sollten, wenn es nicht die richtigen Thread-Ressourcen bekommt, die es benötigt, nach der Dokumentation

    
Daniel DiPaolo 14.10.2010 20:50
quelle
1

Sie treffen ein hartes Limit. Wie andere gesagt haben, gibt es zwei Einschränkungen:

  • Die Anzahl der Threads, die ein Prozess generieren kann, ist vom Betriebssystem begrenzt (entweder global oder pro Prozess)
  • Der verfügbare Speicher ist begrenzt und jeder Thread reserviert seinen eigenen Stack (typischerweise ein paar MB und 4 MB * 900 - & gt; 3,6 Go)

Das ist übrigens so interessant an Google Go-Routinen. Anstatt so viele Threads wie möglich hervorzubringen, passt die Go-Laufzeit die Anzahl der Threads an die Anzahl der verfügbaren Kerne an und multiplext die Routinen dieser physischen Threads manuell.

Darüber hinaus sind die Routinen leicht (reserviert nur 4 KB pro Stück), weil sie keinen herkömmlichen Stapel verwenden (Verschwinden des Stapelüberlaufs!), was bedeutet, dass Sie effektiv einige tausend Routinen auf einer typischen Maschine und es überspannen können kostet dich nicht viel.

Wenn Sie mit extremer Parallelität experimentieren möchten:

  • finden Sie heraus, wie Sie den Stack pro Thread reduzieren können (achten Sie auf Stack Overflow)
  • Wechseln Sie zu Go, oder suchen Sie eine andere Sprache, die Routinen implementiert
Matthieu M. 15.10.2010 07:21
quelle
0

Es gibt Betriebssystemgrenzen. Es wird hauptsächlich darauf ankommen, wie viel Speicher Sie auf Ihrem System haben. Wenn ich mich richtig erinnere, bekommt jeder Thread von pthread mindestens 32 Megabyte Speicher. Der Standardwert ist viel mehr.

    
Jay 14.10.2010 22:10
quelle