Laden...

Mehrere Threads

Erstellt von formatter vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.793 Views
F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren
Mehrere Threads

Hallo Leute,

gibt es eine Obergrenze wie viele Threads das eigene Programm aufmachen darf (mal von evtl. Synchronisationsaufwand abgesehen) ??
Bei den hunderten Dingen, die unser geliebtes Windows so im Hintergrund durchführt, dürfte es doch nicht weh tun, wenn man ein knappes Duzend Threads aufmacht, oder??

Wenn ein Thread gestartet ist und auf ein Event warten soll könnte man ihn ja immer ein paar Millisekunden zwischendurch schlafen lassen. Kann er dann das Event evtl. verpennen oder wird das automatisch irgendwo gepuffert??

B
1.529 Beiträge seit 2006
vor 17 Jahren

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

Ein Event wird nicht verpennt. Das nächste Mal, wenn der Thread aktiviert wird, wird das Event ausgelöst.

EDIT:

ein knappes Duzend Threads

schalte mal im Taskmanager die Spalten Handles und Threads sichtbar und starte ein Programm, dass auch nur unwesentlich umfangreicher als MineSweeper ist...

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo formatter,

ein knappes Dutzend sollt ok sein. Jedoch wird ein Programm auf einem SingeCore durch mehr Threads eher langsamer als schneller, es sei denn, die Threads enthalten blockierende I/O-Aufrufe.

Welche Art von Events meinst du. Thread.Sleep ist unabhängig davon selten eine gute Idee. Es gibt deutlich besseres. Das hängt aber davon ab, welche Events du meinst.

herbivore

F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren

...an die 2000 Threads werde ich wohl nicht ranreichen, zumindest nicht geplanterweise!

Wie ich es implementieren möchte weiß ich selbst noch nicht. Im Groben:

Berechne irgendwelche Dinge und wenn ein spezielles Ergebnis kommt soll etwas passieren. Die Berechnung soll aber unabhängig davon weitergehen. Diese automatische Auslösung kann auch sofort ein weiteres Mal passieren. Neben der automatischen möchte ich aber auch noch manuell auslösen dürfen. Die Auslösungen müssen auf jeden Fall nacheinander bearbeitet werden und können etwas dauern, greifen dabei auch auf eine Datenbank zwecks lesen/schreiben zu.

Daher dachte ich an einen eigenen Thread der zu Beginn gestartet wird und auf die Auslösungen wartet. Diese sollte er dann der Reihenfolge nach bearbeiten. Wenn die Bearbeitung abgeschlossen ist wäre eine Rückmeldung an den Aufrufen noch schön.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Von 2000 als Obergrenze war auch nie die Rede. Im Protected-Mode des x86-Designes hat das TaskSelector-Register eine Breite von 32Bit. Damit könnte es theoretisch rund 4 Milliarden hardware-gestützte Tasks geben.
Wenn man das ganze per Software macht (wie Win32), ist man prinzipiell in der Anzahl der Tasks unbeschränkt.

Die einzige effektive Einschränkung, die auch auf der oben verlinkten Seite angegeben ist, stellt damit der Speicherplatz dar (jeder Thread bekommt ja einen eigenen Stack). Ein 32Bit Programm nutzt unter Windows per Default 2GB virtuellen Adressraum, möglich sind auch 3GB. Da der Speicherplatz von Windows in 64KB-Blöcken vergeben wird, ergibt sich ein theoretisches Maximum für das Win32-System von 2GB / 64KB (bzw. 3GB / 64KB) und damit 32.768 (bzw. 49.152) Threads.

Allerdings läuft bei einer Anwendung, die mehr als hundert Threads pro Prozessor unterhält, mit Sicherheit etwas schief.
Ein paar Dutzend sind aber kein Problem. Solange sichergestellt ist, dass die Anwendung nicht immer neue Threads aufmacht... Aber dazu gibt es ja den ThreadPool.