2009-01-27 13 views

Antwort

32

Zuerst würde ich Ihnen raten Lektüre dieses: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

dann http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx

Um es zusammenzufassen, die Begrenzung normalerweise Stapelspeicher ist (die in zusammenhängenden Blöcken sein muss), und da jeder Thread verbraucht dieses verstreut Sie schnell keine zusammenhängenden Blöcke mehr haben. Auf 64-Bit-Maschinen und Betriebssystemen ist dies viel weniger ein Problem.

Mitigation Strategien existieren, aber nur so weit gehen (und verlassen sich auf Sie nicht viel Stapel pro Faden)

Als grobe Richtlinie:

  • Schaffung Zehn ist so gut wie sicher
  • arbeiten Hunderte ist wahrscheinlich auf aktuellen Server-und Desktop-Hardware, aber riskant
  • Tausende werden fast sicher scheitern.

Sie sollten wahrscheinlich nicht mehr als zehn erstellen müssen sowieso (und wenn Sie wirklich Notwendigkeit tun, um Sie diese Informationen bereits wissen sollten)

+0

Erstellen Sie alle früh und Pool für spätere Verwendung, wenn der Speicher nicht fragmentiert ist, sollte auch helfen. –

0

Ich rate es ist nicht die Anzahl der Threads, aber die Speicherbelegung ist der begrenzende Faktor.

1

Soweit ich das ganze Threading-Modell verstehen sollte es Seit Win2K hat sich nicht viel geändert.

Es gibt keine wirkliche Grenze von Threads per se, aber mehr eine Begrenzung der Prozesse Stack-Space. Weitere Details hierzu finden Sie unter in-depth explanation of threading limits von Raymond Chen.

+0

Bingo! "Aber die wirkliche Frage, die aufgeworfen wird, wenn jemand fragt:" Wie viele Threads kann ein Prozess maximal erstellen? "Lautet:" Warum erstellen Sie so viele Threads, dass dies sogar zu einem Problem wird? "" – TheSoftwareJedi

21

Die beste Antwort, die ich gehört habe, wenn solche Fragen zu stellen, ist:

Es spielt keine Rolle, und wenn Sie feststellen, dass es keine Rolle spielt, müssen Sie zu überdenken, was Sie tun, damit es ist egal.

+5

Bravo, threads werden selbstzerstörerisch (und ineffizient), wenn Hunderte von kleinen Kerlen herumschwimmen. Verwenden Sie einen Thread-Pool und Sie müssen sich keine Sorgen machen. – paxdiablo

+1

+1 für den Kommentar. Meinen Tag gerettet. Und was das Threading angeht, ist es sicherlich richtig. –

+0

Ich werde Windows auf Knights Landing laufen lassen. So ist es jetzt sehr wichtig mit 256-288 Threads – user1649948

12

Beachten Sie, dass Sie Ihr Design genau untersuchen sollten, wenn Sie daran interessiert sind, dieses Limit zu überschreiten !!!!!!!!

Die Antwort auf Ihre "wichtigere Frage", was passiert, ist OutOfMemoryException.

Nicht gerade eine direkte Antwort, aber hier ist ein Code, um das Limit zu finden. Es könnte jedoch speicherabhängig verfügbar sein. Wäre daran interessiert, andere OS/CPU/Mem-Ergebnisse zu sehen.

Fühlen Sie sich frei, Ihre Maschine in bearbeiten und hinzufügen:

  • Windows 7, VS2008, Dual-Core, 2 GB mem: 1465 dann abstürzen mit OutOfMemoryException

    int i = 0; 
        try 
        { 
         while (true) 
         { 
          new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start(); 
          i++; 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(i); 
         Console.WriteLine(ex.ToString()); 
        } 
    
+0

+1 auf der "wenn Sie fragen müssen, dann tun Sie etwas falsch" -Stimmung! –

+0

Warum würdest du das Wiki Wiki machen? Es ist eine gute Antwort (Ich habe dich angesprochen); Sie sollten dafür Kredit bekommen. –

+0

Community-Wiki, weil mir das Rep-Zeug egal ist, und es anderen das Hinzufügen von Ergebnissen erleichtert. – TheSoftwareJedi

1

die Do lesen Raymond Chen Blog-Beiträge, die auf ShuggyCoUk's answer hingewiesen.

aber besonderes Augenmerk auf dieses Bit: „Was ist die maximale Anzahl von Threads, die ein Verfahren schaffen“

Aber die eigentliche Frage, die aufgeworfen wird, wenn jemand fragt, ist "Warum erstellen Sie so viele Threads, dass dies sogar zu einem Problem wird?"

Das "Ein-Thread-pro-Client" -Modell ist bekannt dafür, dass es nicht über ein Dutzend Clients hinaus skaliert. Wenn Sie mehr als die meisten Clients gleichzeitig verarbeiten möchten, sollten Sie zu einem Modell wechseln, in dem Sie statt eines Threads einem Client ein Objekt zuweisen. (Eines Tages werde ich über die Dualität zwischen Threads und Objekten nachdenken.) Windows stellt I/O-Completion-Ports und einen Thread-Pool zur Verfügung, mit dem Sie von einem Thread-basierten Modell in ein Work-Item-basiertes Modell konvertieren können.

1

Wenn Sie mit einem bestehenden Design stecken geblieben sind, die eine hohe Anzahl von Threads verwendet und skalieren muss, könnten Sie auch Fasern betrachten:

http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx

Es können Sie insgesamt Redesign speichern.

Indy dachte es für Indy 10, aber es geschah nie, weil die .NET-Abenteuer die meiste Zeit konsumierten, wie es scheint.

+0

Die zweite Verbindung von ShuggyCoUk zu OldNewThing sagt folgendes über Fasern: * Beachten Sie, dass Fasern hier nicht viel helfen, weil eine Faser einen Stapel hat und der Adressraum, der vom Stapel benötigt wird, fast immer der limitierende Faktor ist. * – foraidt

+0

ShuggyCoUks Link bedeutet, dass es nicht die ultimative Lösung ist. Ich sehe es eher als zusätzliche Skalierung, bei der volle Threads nicht verschwinden. Aber wie gesagt, das Wissen stammt aus der Zeit der Diskussionen in einer Zeit, in der 64-Bit Alpha bedeutet. –

0

Standard-Stack-Größe ist 1 MB und der Adressraum für den Benutzermodus, der dem Windows-Prozess unter 32-Bit-Windows-Betriebssystem zugewiesen ist, beträgt ungefähr 2 GB. das erlaubt rund 2000 Threads pro Prozess (2000 * 1MB = 2GB). für 64 bit gibt es praktisch kein Problem.

Verwandte Themen